2012-08-05 99 views
8

我的日期字符串格式是這樣的:2012年1月2日 在Instant.parse()方法之後,即時實例變爲2012年1月1日的日期是1天前,爲什麼?如果原來的日期字符串爲2012年1月1日,即時將是12月31日,2011年在MongoDB中的日期:當將日期對象插入Mongo數據庫時,日期比它自己早1天

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") 
    } 
+1

您是否嘗試添加時區組件?它可能與你的本地和日期抵消你的時區的東西。 – 2012-08-07 21:22:50

回答

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 
+0

感謝您的回覆。是的,日期字符串 - >即時沒有錯。當我將這些日期插入MongoDB時,出現了這個問題。仍然不知道爲什麼...我已經更新了這個問題。 – 2012-08-08 08:04:12

+0

可能你有TimeZone -10。因此節省了前一天下午2點的時間。當我使用MongoDB時,我將日期保存爲毫秒內的long值 – Ilya 2012-08-08 11:31:17

+0

是的,它是一個時區問題。我在澳大利亞布里斯班。這是UTC + 10。 [本頁](https://jira.mongodb。org/browse/CSHARP-185)說:「MongoDB以UTC來存儲所有日期時間,當你存儲在數據庫中時,你提供的任何本地時間都被轉換爲UTC」。當我通過Java API查詢來自MongoDB的日期時,我發現插入後日期會再次轉換爲本地時間。所以現在好了。謝謝。 – 2012-08-10 01:54:52

1

Mongo自Unix時代開始存儲以毫秒爲單位的日期。

請參見:http://www.mongodb.org/display/DOCS/Dates

所以你不要有任何時區。但是,如果您使用控制檯,則.js分析器會將UTC日期轉換爲您當前的系統時區設置。

您可以測試:

  • 一些日期數據創建一個實體。
  • 然後通過控制檯查詢它。 (使用字符串())
  • 然後退出控制檯並重新配置系統時區(於Debian/Ubuntu:sudo的dpkg的 - 重新配置的tzdata)
  • 然後再次進入控制檯和查詢您的舊數據=>你會得到相同的UTC但不同的toString()輸出
0

你可以檢查UTC時區,基本上蒙戈服務器的運行依賴於UTC時區

的SimpleDateFormat格式=新的SimpleDateFormat( 「DD/MM/YYYY」); format.setTimeZone(TimeZone.getTimeZone(「UTC」));