[英]What is the purpose of this code? Is it just duplicating a Date?
我遇到了一個不在公司工作的人的代碼。
我想知道這個日歷魔術的目的是什么:
if (value instanceof Date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime((Date) value);
return new Date(calendar.get(Calendar.YEAR) - 1900, calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
}
在我看來,這將返回一個新的Date
對象,其值與原始value
相同。 是否有一些日歷初始化正在進行中我缺少? 如果目的是返回一個具有相同值的新對象,我會假設value.clone()
完成這項工作:
(Date) originalDate.clone()
// or
new Date(originalDate.getTime())
版本控制顯示代碼永遠不會更改。 首先通過日歷拉日期是否有可能產生副作用?
它只是一種過時的方式 ,可以從您的初始日期中刪除小時,分鍾和秒。
正如您在這個簡單示例中所看到的:
Date value = new Date();
System.out.printf("Before %s%n", value);
Calendar calendar = Calendar.getInstance();
calendar.setTime(value);
System.out.printf(
"After %s%n",
new Date(
calendar.get(Calendar.YEAR) - 1900,
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH)
)
);
輸出:
Before Thu Oct 06 11:19:26 GMT 2016
After Thu Oct 06 00:00:00 GMT 2016
該代碼試圖將時間清除到00:00:00
。 但這是對課程的濫用,忽略了時區的關鍵問題,並使用了臭名昭着的舊日期時間類。 這些舊類現在已經遺留下來,取而代之的是java.time類。
程序員可能想要:
LocalDate
LocalDate
類表示沒有時間且沒有時區的僅日期值。
時區對於確定日期至關重要。 對於任何給定的時刻,日期在全球范圍內因地區而異。 例如, 法國巴黎午夜過后幾分鍾是新的一天,而在魁北克蒙特利爾仍然是“昨天”。
ZoneId z = ZoneId.of( “America/Montreal” );
LocalDate today = LocalDate.now( z );
today.toString():2016-01-23
ZonedDateTime
對於日期時間值,首先將當前日期作為LocalDate
對象獲取,如上所示。 然后致電atStartOfDay
獲取當天的第一時刻。 不要以為第一個矩是時間00:00:00
。 夏令時(DST)等異常意味着第一時刻可能是01:00:00
。 所以讓java.time確定那個時間。
ZonedDateTime todayStart = today.atStartOfDay( z );
today.toString():2016-01-23T00:00:00-05:00 [美國/蒙特利爾]
提示:永遠不要試圖確定一天中的最后一刻。 始終使用第二天的第一刻。 搜索Stack Overflow for“Half-Open”獲取更多信息。
Instant
你的大部分工作都應該用UTC完成。 要將ZonedDateTime
移動到UTC,請提取Instant
。 Instant
類表示UTC時間軸上的一個時刻,分辨率為納秒 (最多九(9)位小數)。
Instant instant = zdtStart.toInstant();
您應該避免使用舊的日期時間類。 但是,如果必須與尚未更新為java.time類型的舊代碼進行互操作,則可以轉換為/來自java.time。 尋找添加到舊類的新方法。
java.util.GregorianCalendar gc = GregorianCalendar.from( zdtStart );
java.util.Date d = Date.from( instant );
java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊日期時間類,如java.util.Date
, .Calendar
和java.text.SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time。
要了解更多信息,請參閱Oracle教程 。 並搜索Stack Overflow以獲取許多示例和解釋。
大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,並進一步適應的Android在ThreeTenABP (見如何使用...... )。
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.