我試圖更改日曆對象的時區,同時保持實際的日期/時間,以便我可以調用更新的日曆對象上的getTimeInMilliseconds()。我看了一下this other question。這裏,接受的答案是單獨設置新日曆對象的每個字段。不過,只需更改原始日曆對象副本的時區即可使其工作。奇怪的是,這隻有在重設時區之前對原始日曆進行一些修改纔有效。以下示例說明了不一致性。JAVA:更改日曆對象的TimeZone時奇怪的行爲,而不更改日期/時間
public void TestCalendar()
{
Calendar nextYear = Calendar.getInstance();
nextYear.add(Calendar.YEAR, 1);
log.info("Next Year: {}", getUTCMilliseconds(nextYear));
Calendar now = Calendar.getInstance();
log.info("Now: {}", getUTCMilliseconds(now));
}
protected String getUTCMilliseconds(Calendar cal)
{
// Create a new calendar so we don't modify input
Calendar expectedDbTime = (Calendar) cal.clone();
// Change the TimeZone the contained date is interpreted in
expectedDbTime.setTimeZone(TimeZone.getTimeZone("UTC"));
// Return millisecond value of this date in the UTC timezone
return String.valueOf(expectedDbTime.getTimeInMillis());
}
我跑了1月24日該計劃,2015年@下午2:33,並得到了以下的輸出:
Next Year: 1422110038529 //(Corresponding UTC Date: Sat Jan 24 2015 2:33:58 PM)
Now: 1390599238531 //(Corresponding UTC Date: Fri Jan 24 2014 9:33:58 PM)
正如你可以看到,如預期的那樣nextYear版畫,但下一行與預期的不同,它不是 (它應該對應於2014年1月24日下午2點33分58秒,相反,它對應於當前日期/時間,即2014年1月24日2:33:58 MTN) 。有人能告訴我這裏發生了什麼事嗎?
編輯:只是更新了一些格式。
setTimeZone的'的行爲()'是非常反直覺的,有效打破。這種行爲存在一些錯誤: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4827490 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id= 4177484 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4096231 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4227735 –
@goparkyourcar你的問題不明確。究竟你想從什麼開始,你想要什麼作爲輸出? –
我的意圖是,給定一個日曆對象,表示某個時區的某個日期/時間(說2012年1月1日12AM MTN),我想獲得同一日期在另一個時區的毫秒值(Say 2012年1月1日上午12點)。我的問題是,爲什麼我必須在調用我的getUTCMilliseconds()函數以使所述函數正常工作之前修改Calendar對象。 – Cod3Citrus