8

我的日期字符串格式是这样的:Jan 2, 2012 在 Instant.parse() 方法之后,instant instance 变成了 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")
    }
4

3 回答 3

1
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
于 2012-08-07T20:55:46.950 回答
1

Mongo 自 Unix 纪元以来以毫秒为单位存储其日期。

见:http ://www.mongodb.org/display/DOCS/Dates

所以你没有任何时区。但是,如果您使用控制台,.js 解析器会将 UTC 日期转换为您当前的系统时区设置。

你可以测试一下:

  • 使用一些日期数据创建一个实体。
  • 然后通过控制台查询它。(使用字符串())
  • 然后退出控制台并重新配置系统时区(debian/ubuntu:sudo dpkg-reconfigure tzdata)
  • 然后再次进入控制台并查询你的旧数据 => 你得到相同的 UTC 但不同的 toString() 输出
于 2012-08-08T14:24:50.703 回答
0

您可以检查 UTC 时区,基本上 mongo 服务器根据 UTC 时区运行

SimpleDateFormat 格式 = new SimpleDateFormat("dd/MM/yyyy"); format.setTimeZone(TimeZone.getTimeZone("UTC"));

于 2016-06-30T08:15:12.827 回答