Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MongoDB中的日期:将日期对象插入Mongo数据库时,日期比其本身早1天_Java_Mongodb_Jodatime_Instant - Fatal编程技术网

Java MongoDB中的日期:将日期对象插入Mongo数据库时,日期比其本身早1天

Java MongoDB中的日期:将日期对象插入Mongo数据库时,日期比其本身早1天,java,mongodb,jodatime,instant,Java,Mongodb,Jodatime,Instant,我的日期字符串格式如下:2012年1月2日 在Instant.parse()方法之后,Instant实例的日期变为2012年1月1日,比它早一天,为什么?如果原始日期字符串为2012年1月1日,则即时日期为2011年12月31日 String dateString="Jan 1, 2012"; Instant instant = Instant.parse(dateString, new DateTimeFormatterBuilder() .appendMonthOfYearShortText

我的日期字符串格式如下:2012年1月2日 在Instant.parse()方法之后,Instant实例的日期变为2012年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来存储这些日期。我已经测试过了,它显示在格式化日期字符串->即时时没有错误。 但是,当我将这个日期类型对象插入MongoDB时,MongoDB中的日期字符串变为提前1天,为什么

在MongoDB中:

 /* 0 */
    {
      "_id" : ObjectId("50221a40da74d74053abb445"),
      "time" : ISODate("2011-12-31T14:00:00Z")
    }
输出为

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纪元以来的日期

见:

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

您可以测试:

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

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

SimpleDataFormat格式=新的SimpleDataFormat(“dd/MM/yyyy”); format.setTimeZone(TimeZone.getTimeZone(“UTC”))


您是否尝试添加时区组件?这可能是由于您的本地时间和日期被您的时区所抵消。谢谢您的回复。是的,日期字符串->瞬间没有错误。当我将这些日期插入MongoDB时,这个问题就出现了。仍然不知道为什么…我已经更新了问题。可能是你有时区-10。所以节省的时间是前一天14:00。当我使用MongoDB时,我会像长值一样以毫秒为单位保存日期,这是一个时区问题。我在澳大利亚的布里斯班。是UTC+10。表示“MongoDB以UTC存储所有日期时间。您提供的任何本地时间在存储在数据库中时都会转换为UTC”。当我通过MongoDB的JavaAPI从MongoDB查询日期时,我发现插入后,日期再次转换为本地时间。现在没事了。谢谢。@liya如果格式是“10-05-2013”,那么DateTimeFormatter看起来如何????
2012-01-01T00:00:00.000+02:00
Sun Jan 01 00:00:00 EET 2012