[英]What is the default timezone for java.util.Calendar.?
碼
public String testDate(){
TimeZone.setDefault(TimeZone.getTimeZone("US/Eastern"));
Calendar fromDate = Calendar.getInstance();
Date date= new Date();
System.out.println(fromDate);
System.out.println(date);
}
我的日歷變量在調試下面的日歷變量時顯示cdate值2013-12-09T00:00:00.000Z
和時間值1386649779590
。
Calendar cal = Calendar.getInstance();
我在打印對象時看到的完整日歷詳細信息
System.out.println(cal);
安慰
java.util.GregorianCalendar[time=1386649779590,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="US/Eastern",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=US/Eastern,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2013,MONTH=11,WEEK_OF_YEAR=50,WEEK_OF_MONTH=2,DAY_OF_MONTH=9,DAY_OF_YEAR=343,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=11,HOUR_OF_DAY=23,MINUTE=29,SECOND=39,MILLISECOND=590,ZONE_OFFSET=-18000000,DST_OFFSET=0]
雖然我的java.util.date變量顯示日期為Mon Dec 09 07:37:50 EST 2013
,同時調試日期變量
Date date= new Date();
我設置的默認timezone
是在程序啟動時指定的EST
TimeZone.setDefault(TimeZone.getTimeZone("US/Eastern"));
我正在從timezone
IST工作 。
我的問題是
為什么cal
的Calendar
和date
的Date()
有什么不同?
根據Oracle文檔 ,明確提到,
public static Calendar getInstance()
使用默認時區和區域設置獲取日歷。 返回的日歷基於默認時區中具有默認語言環境的當前時間。
default time zone
由public static TimeZone getDefault()
並在TimeZone.getDefault()中提到
獲取此主機的默認TimeZone。 默認TimeZone的來源可能因實施而異。
除非您使用public static void setDefault(TimeZone zone)
函數顯式設置TimeZone
,否則它將返回計算機中設置的default
時區。
我相信上面的解釋可以回答你的兩個問題,
編輯:根據您編輯的問題
為什么日歷的cal和Date()的日期不同?
當你調用System.out.println(date);
然后調用toString()
函數,如果你查看日期的源代碼,你會發現它通過調用默認時區的displayName
函數來返回時區的3個字母簡寫,這是你的案例EST
3個字母的簡寫,即US Eastern Standard Time (GMT-05:00) Indiana (East)
。
日期本身沒有任何時區。 它的toString()
方法使用當前的默認時區來返回String
通常,您使用getDefault
獲取TimeZone
,它根據程序運行的時區創建TimeZone
。 例如,對於在日本運行的程序, getDefault
會根據日語標准時間創建一個TimeZone
對象。
檢查TimeZone
以獲取更多信息
你提到“cdate”,我注意到Calendar對象里面有一個名為cdate
。 在運行示例代碼時,我看到cdate
字段確實初始化為2013-12-10T00:00:00.000Z
(當然現在是24小時后)。
所以? 當你永遠不會直接使用它們時,我不知道你為什么要查看類的內部字段。
那么,你的解決方案是忽略它。 不要擔心日歷的cdate
字段; 擔心實際影響你的程序的事情。
Calendar
的toString()
不是很漂亮,用於調試; 你應該調用cal.getTime()
,它會給你一個java.util.Date
,你可以直接或使用java.text.DateFormatter
打印出來。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.