簡體   English   中英

這段代碼的目的是什么? 它只是重復日期嗎?

[英]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

Filotto答案是正確的,應該被接受。

該代碼試圖將時間清除到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.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊日期時間類,如java.util.Date.Calendarjava.text.SimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time。

要了解更多信息,請參閱Oracle教程 並搜索Stack Overflow以獲取許多示例和解釋。

大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,並進一步適應的AndroidThreeTenABP (見如何使用...... )。

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM