- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如前所述,我想实现的是,当用户在 JXDatePicker 中编辑日期时,他可以选择是否以相同的格式再次键入它,默认情况下是 dd.MM.yyyy 或只是 dd。 MM.yy。当他使用缩写形式时,我希望选择器选择当前世纪。
示例:
27.01.2012 edited to 27.01.10 should result in 27.01.2010
还有:
27.01.2012 edited to 27.01.2010 should also result in 27.01.2010
默认情况下,JXDatePicker 按以下方式处理它:
27.01.2012 edited to 27.01.10 results in 27.01.0010
这并不是我想要的工作方式。经过一些简短的研究,我在 SimpleDateFormat 中发现了以下方法
/**
* Sets the 100-year period 2-digit years will be interpreted as being in
* to begin on the date the user specifies.
*
* @param startDate During parsing, two digit years will be placed in the range
* <code>startDate</code> to <code>startDate + 100 years</code>.
*/
public void set2DigitYearStart(Date startDate)
乍一看,这听起来完全符合我的需要。所以我测试了它,不幸的是它没有像我希望的那样工作。这是因为我想使用 dd.MM.yyyy 作为显示日期的格式,并且还希望它像在编辑模式中那样显示。例如,当用户点击 2012 年 1 月 27 日这样的日期时,我也希望它在编辑模式下也是这样,而不仅仅是缩写形式:27.01.12。
我现在的问题是,不幸的是,set2DigitYearStart(Date) 只有在我选择在编辑模式下使用简写格式时才有效。我做了一个小例子来展示这种情况(需要 SwingX 库,因为 jxdatepicker 并且可以在 here 中找到)。
public class DatePickerExample extends JPanel
{
static JFrame frame;
public DatePickerExample()
{
JXDatePicker picker = new JXDatePicker();
JTextField field = new JTextField( 10 );
add( field );
add( picker );
final Calendar instance = Calendar.getInstance();
instance.set( 2012, 01, 26 );
Date date = instance.getTime();
picker.setDate( date );
// SimpleDateFormat format = new SimpleDateFormat( "dd.MM.yy" );//Works, but I wonna display and edit it with dd.MM.yyyy
SimpleDateFormat format = new SimpleDateFormat( "dd.MM.yyyy" );
final Date startDate = new Date( 0 );//01.01.1970
format.set2DigitYearStart( startDate );
picker.setFormats( format );
}
public static void main( String[] args )
{
frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setBounds( 400, 400, 400, 400 );
frame.setLayout( new BorderLayout() );
frame.add( new DatePickerExample() );
frame.setVisible( true );
}
}
谁有过同样的需求,能告诉我如何实现吗?欢迎任何想法。非常感谢你提前。伊梅内
最佳答案
最终(希望 :)
第一次编辑总结:
原因是 DatePickerFormatter:它不允许指定 formatting 格式(只使用第一个)。出路是自定义 DatePickerFormatter,它支持它(在代码片段中,它被硬编码为使用第二个):
SimpleDateFormat longFormat = new SimpleDateFormat( "dd.MM.yyyy" );
SimpleDateFormat shortFormat = new SimpleDateFormat( "dd.MM.yy" );
Date startDate = new Date( 0 );//01.01.1970
shortFormat.set2DigitYearStart( startDate );
DatePickerFormatter formatter = new DatePickerFormatter(
// invers sequence for parsing to satisfy the year parsing rules
new DateFormat[] {shortFormat, longFormat}) {
@Override
public String valueToString(Object value) throws ParseException {
if (value == null) return null;
return getFormats()[1].format(value);
}
} ;
DefaultFormatterFactory factory = new DefaultFormatterFactory(formatter );
picker.getEditor().setFormatterFactory(factory);
不完全确定我们是否应该支持在基类中配置格式化程序。 DatePickerFormatter 有点奇怪,它没有扩展 InternalFormatter 并且查找过程有点与 FormatterFactory 竞争......
原创
不完全是 datePicker 以这种方式处理它,它是核心格式(正如 D1e 已经指出的那样)。默认格式/ter/s 都不支持同时两种格式:看,尝试使用核心 JFormattedTextField 实现您的目标:-)
出路可能是 FormatterFactory:它允许根据上下文使用不同的格式:显示和编辑 - 后者在字段获得焦点时使用,前者在所有其他时间使用。由于选择器的编辑器是 JFormattedTextField,您可以直接配置它(而不是使用 setFormats 方法)
SimpleDateFormat format = new SimpleDateFormat( "dd.MM.yyyy" );
SimpleDateFormat editFormat = new SimpleDateFormat( "dd.MM.yy" );
final Date startDate = new Date( 0 );//01.01.1970
instance.setTime(startDate);
editFormat.set2DigitYearStart( instance.getTime() );
DefaultFormatterFactory factory = new DefaultFormatterFactory(
new DatePickerFormatter(new DateFormat[] {format}),
new DatePickerFormatter(new DateFormat[] {format}),
new DatePickerFormatter(new DateFormat[] {editFormat})
);
picker.getEditor().setFormatterFactory(factory);
编辑
读完 Robin 最近的回答(+1!)后脑袋砰砰直跳——终于,在多年之后令人尴尬的是,我明白了 SwingX 的 DatePickerFormatter 试图做的事情:那就是支持格式化程序的查找链(从长到短), 提交后使用的时间最长,使用时间越短,以方便用户输入。
不幸的是,这并没有像直观预期的那样工作。给定一系列格式,从长到短(并根据世纪适当配置):
"yyyy", "yy"
和给定的输入
"10"
感觉像是从第一传到第二,导致
2010
但不是。正如 SimpleDateFormat 中记录的那样(谁阅读文档......懒惰我,咳嗽......)
Year: [ ... ] For parsing, if the number of pattern letters is more than 2, the year is interpreted literally, regardless of the number of digits. So using the pattern "MM/dd/yyyy", "01/11/12" parses to Jan 11, 12 A.D.
归根结底——因为 DatePickerFormatter 试图支持该查找但没有成功——毕竟这可能被认为是 SwingX 问题:-)
关于java - JXDatePicker 使用 SimpleDateFormat 将 dd.MM.yy 格式化为当前世纪的 dd.MM.yyyy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9034766/
我正在使用 filebeat 使用 logstash 将我的日志推送到 elasticsearch,并且之前的设置对我来说运行良好。我收到 Failed to publish events error
我有一个带有日期列 Date ( df ) 的 data.frame ( dd-mm-yyyy )。 如何将其转换为 ( mm-yyyy )? 我努力了: dates <- as.Date(df$Da
lex.yy.c 中的“yy”代表什么? 最佳答案 Lex 旨在与 Yacc 配合使用。 Steven Johnson 的论文 Yacc: Yet Another Compiler Compiler
我陷入了这样一种情况:我通过“LOAD DATA LOCAL INFILE”从 CSV 文件读取数据并将其存储在 Mysql 表中。 我的表格中的日期列是字符串类型。 如果我的日期格式为'yy/dd/
我需要更改日期格式以将其插入数据库,但遗憾的是更改 dateFormat 变量不起作用。我有一些验证可以将日期提前到当前日期,并使超出的日期不可点击。 $( function() { v
我使用 Google 表单来收集用户的日期,他们使用日期选择器。格式是美国格式,mm/dd/yy (1/25/2016),但我需要欧盟格式 dd/mm/yy (25/1/2016)。 该脚本收集多个日
如何将日期从 dd-mm-yy 转换为 mm-dd-yy 下面是我的代码 但结果是:09-10-2001 我需要 09-01-2010 最佳答案 这行不通: date('m-d-y', strtot
我的数据库中有一些日期格式为 dd-mm-yy,还有一些日期格式为 yy-mm-dd 我希望它们都在 yy-mm-dd 中 它们存储在 VARCHAR 字段中 示例日期是: 2011-10-19 和
嗨,我有一个 excel 文件,其中包含以下格式的年份列 yy-yy有数千行。例如, year 65-67 99-02 03-05 现在我希望这个专栏是这样的 year 1965-1997 1999-
行为: 当我转置一个包含日期的一维数组以便将它们完整地打印到一张纸上时,一些日期从 dd/mm/yy至mm/dd/yyyy . 特别是,当月份中的某天: 小于等于 12,如 January 2, 20
在我的表格中,我有: __('Date') ?>: " class="v-middle"/> 这显示日历。 在标题中我有: js_csscalendar/calendar-win
当我将格式为“dd/mm/yy”的文件中的日期插入到日期格式为“yy/mm/dd”的数据库表中时,日期是错误的: 我得到的不是 2019:04:11,而是 2011:04:19。 我想保留数据库格式(
这是一个奇怪的问题,但我有一个 2018 年 10 月 11 日的原始 excel,当我使用以下方法将列转换为日期时间时会发生上述问题: df.Date = pd.to_datetime(df['Da
我正在尝试对 pandas 处理日期和格式的功能进行简单的测试。为此,我创建了一个具有如下值的数据框。 : df = pd.DataFrame({'date1' : ['10-11-11','12-1
正如标题所说,我想将日期选择器格式从 mm-dd-yy 更改为 dd-mm-yy。 这是我的完整代码: $(function() { $('#datepicker').datepicker({
需要帮助查找或让正则表达式匹配 MM/YY 或 MM/YYYY 格式。我的 RegExFu 很弱,我什至不知道从哪里开始写。 月份应该是 1-12,年份,2009 年之后的任何内容都应该有效。很抱歉之
我最近将字段的数据类型从 varchar 更改为 datetime,但在此之前,我首先复制了它,因为内容将重置为此值 000-00-00 00-00-00 现在,我正在尝试更新表的日期时间字段。 这就
好吧,我已经和这个战斗了足够长的时间。我有一个正则表达式 ^(1[0-2]|0[1-9]|\d)\/(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d) 这将匹配 8/15、08/15
下面的查询返回结果: SELECT * FROM EMPLOYEES WHERE HIRE_DATE = TO_DATE('21-09-1989','DD-MM-YY'); 好像我将日期从 21-09
我在使用 Excel 宏 (VBA) 时遇到问题,该宏旨在从 Excel 电子表格中获取日期,减去一个月并将其重新格式化为 MMM-YY。基本上我想采取 3/31/2013 并将其转换为 2 月 13
我是一名优秀的程序员,十分优秀!