Simpledateformat对称格式化/解析

时间:2015-09-25 09:31:34

标签: java date datetime

我尝试使用SimpleDateFormat格式化时间戳,并尝试使用相同的格式来解析这样的格式化日期:

SimpleDateFormat sdf = new SimpleDateFormat("MMM d, YYYY 'at' hh:mma z");
GregorianCalendar cal = new GregorianCalendar(Locale.US);
sdf.setTimeZone(cal.getTimeZone())

sdf.parse(sdf.format(1435271907000L)).getTime() == 1435271907000L

最后一个表达式为false,实际结果为1419806280000L

那么如何实现对称的dateTimeFormat解析/格式化行为呢?

2 个答案:

答案 0 :(得分:1)

首先,您的格式模式中没有秒数,因此您的日期秒将初始化为0.其次:YYYY is different from yyyy

ss添加到您的模式中,并将YYYY更改为yyyy

SimpleDateFormat sdf = new SimpleDateFormat("MMM d ss, yyyy 'at' hh:mma z");

String f = sdf.format(1435271907000L);
Date d = sdf.parse(f);

System.out.println(d.getTime() == 1435271907000L);

请注意,它还会打印false时间,以毫秒为单位> 0(例如1435271907001L)。如果您需要毫秒精度,那么您还需要为模式添加毫秒SSS

SimpleDateFormat sdf = new SimpleDateFormat("MMM d ss SSS, yyyy 'at' hh:mma z");

答案 1 :(得分:0)

通过纠正MMM和HH的案例来尝试这个,

SimpleDateFormat sdf = new SimpleDateFormat("MMM d, yyyy 'at' HH:mm:ss.a`Z`");
GregorianCalendar cal = new GregorianCalendar(Locale.US);
sdf.setTimeZone(cal.getTimeZone())
sdf.parse(sdf.format(1435271907000L)).getTime() == 1435271907000L

我希望这会奏效。