2012-06-27 40 views
3

我試圖將Date轉換爲String,然後再回到Date。但是我發現最終日期與原始日期不同,是什麼給了?Java,將日期轉換爲字符串並返回錯誤日期

//1975-06-20 
    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.YEAR, 1975); 
    cal.set(Calendar.MONTH, 5); 
    cal.set(Calendar.DAY_OF_MONTH, 20); 
    cal.set(Calendar.HOUR, 0); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    System.out.println(cal); 

    Date originalDate = cal.getTime(); 
    System.out.println("Date 1: " + originalDate.toString()); 

    SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); 
    Date date = sdf.parse(originalDate.toString()); 
    System.out.println("Date 2: " + date.toString()); 

從上面的代碼的輸出是:

cal: java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Singapore",offset=28800000,dstSavings=0,useDaylight=false,transitions=9,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=1975,MONTH=5,WEEK_OF_YEAR=26,WEEK_OF_MONTH=5,DAY_OF_MONTH=20,DAY_OF_YEAR=179,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=0,HOUR_OF_DAY=16,MINUTE=0,SECOND=0,MILLISECOND=333,ZONE_OFFSET=28800000,DST_OFFSET=0] 
Date 1: Fri Jun 20 12:00:00 SGT 1975 
Date 2: Fri Jun 20 11:30:00 SGT 1975 
+2

[日曆](http://docs.oracle.com/javase/6 /docs/api/java/util/Calendar.html)是可識別的區域,其中Date不是。請參閱[這篇文章的更多信息](http://stackoverflow.com/questions/2697549/how-to-make-date-locale-independent) – Brad

+5

沒有DateFormat.format(String,String)方法。你的代碼不能編譯。格式化Date的toString()表示有什麼意義?爲什麼要解析originalDate的toString()而不是解析格式化日期? –

+0

@Brad,[它不是?](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Date.java#Date。 toString%28%29) – JMelnik

回答

13

因爲1982(+ 30分鐘)在新加坡時區變化的可能。

http://www.timeanddate.com/worldclock/timezone.html?n=236&syear=1980

SimpleDateFormat的取SGT爲UTC + 8解析日期時,並將其轉換爲UTC + 7.5,這是SGT之前1982年因此,日期是關閉的30分鐘。

+0

這解釋了30分鐘的差異,但並沒有解釋爲什麼在用cal.set(Calendar)設置時,原始時間中的「小時」顯示爲「12」。 HOUR,0)'。 @Rosdi,這是你的問題中的一個錯字嗎? – Brad

+0

@Brad:由於'HOUR'是上午/下午的小時(12小時週期),並且它在新加坡當前下午(影響'.getInstance()'),因此它會設置爲12 PM 'HOUR'設置爲0.'HOUR_OF_DAY'將設置一天24小時的小時。 – nhahtdh

+0

@布拉德不是它不是一個錯字。 –

0

你確定你粘貼的代碼是正確的嗎?

Date date = DateFormat.format(originalDate.toString(),「EEE MMM dd HH:mm:ss zzz yyyy」);

似乎有問題:沒有與簽名日期DateFormat.format(字符串,字符串)沒有方法,據我所知

+0

我已刪除該部分。這是由我的團隊創建的實用工具類。對於那個很抱歉。但我的問題仍然有效。 –