我的日期字符串格式如下:2012年1月2日在Instant.parse()方法之后,Instant实例变成了2012年1月1日,提前了1天,为什么?如果原始日期字符串为2012年1月1日,则即时消息将为2011年12月31日。
String dateString="Jan 1, 2012";
Instant instant = Instant.parse(dateString, new DateTimeFormatterBuilder()
.appendMonthOfYearShortText()
.appendLiteral(" ")
.appendDayOfMonth(1)
.appendLiteral(", ")
.appendYear(4, 4)
.toFormatter());
DateTime dateTime = new DateTime(instant);
Date date = new Date(dateTime.getMillis());
document.append("time", new Date(dateTime.getMillis()));
tagsDbCollection.insert(document);
我正在使用MongoDB来存储这些日期。我已经测试过了,它显示在格式化日期字符串->即时时没有错误。但是当我把这个Date类型的对象插入MongoDB时,MongoDB中的日期字符串会提前1天。,为什么?
在MongoDB中:
/* 0 */
{
"_id" : ObjectId("50221a40da74d74053abb445"),
"time" : ISODate("2011-12-31T14:00:00Z")
}
final String dateString = "Jan 2, 2012";
final DateTimeFormatter dtf = new DateTimeFormatterBuilder().appendMonthOfYearShortText().appendLiteral(" ").appendDayOfMonth(1).appendLiteral(", ").appendYear(4, 4).toFormatter();
final DateTime jodaDate = dtf.parseDateTime(dateString);
System.out.println(jodaDate);
final Date javaDate = new Date(jodaDate.getMillis());
System.out.println(javaDate);
输出为
2012-01-02T00:00:00.000+02:00
Mon Jan 02 00:00:00 EET 2012
下一个:
final String dateString = "Jan 1, 2012";
输出为:
2012-01-01T00:00:00.000+02:00
Sun Jan 01 00:00:00 EET 2012
Mongo存储自Unix epoch以来的日期(以毫秒为单位)。
请参阅:http://www.mongodb.org/display/DOCS/Dates
所以你没有任何时区。但是,如果您使用控制台,.js解析器会将UTC日期转换为您当前的系统时区设置。
你可以测试一下:
- 使用一些日期数据创建实体
- 然后通过控制台进行查询。(使用String())
- 然后退出控制台并重新配置系统时区(debian/ubuntu:sudo-dpkg-refigure-tzdata)
- 然后再次进入控制台并查询旧数据=>您得到相同的UTC但不同的toString()输出
您可以检查UTC时区,基本上mongo服务器根据UTC时区运行
SimpleDateFormat format=新的SimpleDateFormat("dd/MM/yyyy");format.setTimeZone(TimeZone.getTimeZone("UTC"));