簡體   English   中英

日歷對象的日期對象 [Java]

[英]Date object to Calendar [Java]

我有一個電影類,我有一個開始日期、一個持續時間和一個停止日期。 開始和停止日期是日期對象(私人日期開始日期...)(這是一個分配,所以我不能改變它)現在我想通過將持續時間(以分鍾為單位)添加到開始日期來自動計算停止日期。

根據我的知識,不推薦使用 Date 的時間操作函數,因此是不好的做法,但另一方面,我認為無法將 Date 對象轉換為日歷對象以操縱時間並將其重新轉換為 Date 對象。 有辦法嗎? 如果有什么是最佳實踐

您可以做的是創建一個GregorianCalendar的實例,然后將Date設置為開始時間:

Date date;
Calendar myCal = new GregorianCalendar();
myCal.setTime(date);

但是,另一種方法是根本不使用Date 你可以使用這樣的方法:

private Calendar startTime;
private long duration;
private long startNanos;   //Nano-second precision, could be less precise
...
this.startTime = Calendar.getInstance();
this.duration = 0;
this.startNanos = System.nanoTime();

public void setEndTime() {
        this.duration = System.nanoTime() - this.startNanos;
}

public Calendar getStartTime() {
        return this.startTime;
}

public long getDuration() {
        return this.duration;
}

通過這種方式,您可以訪問開始時間並獲取從開始到停止的持續時間。 當然,精度取決於您。

Calendar tCalendar = Calendar.getInstance();
tCalendar.setTime(date);

日期是一個 java.util.Date 對象。 您也可以使用 Calendar.getInstance() 來獲取 Calendar 實例(效率更高)。

Calendar.setTime()

查看 API 方法的簽名和描述通常很有用,而不僅僅是它們的名稱 :) - 即使在 Java 標准 API 中,名稱有時也會產生誤導。

您不需要為此轉換為Calendar ,您可以使用getTime() / setTime()代替。

getTime() :返回自 1970 年 1 月 1 日格林威治標准時間 00:00:00 以來由此 Date 對象表示的毫秒數。

setTime(long time) :將此 Date 對象設置為表示一個時間點,即 1970 年 1 月 1 日 00:00:00 GMT 之后的時間毫秒。 )

一秒有 1000 毫秒,一分鍾有 60 秒。 只是做數學。

    Date now = new Date();
    Date oneMinuteInFuture = new Date(now.getTime() + 1000L * 60);
    System.out.println(now);
    System.out.println(oneMinuteInFuture);

1000L后綴表示它是一個long字面量; 這些計算通常很容易溢出int

tl;博士

Instant stop = 
    myUtilDateStart.toInstant()
                   .plus( Duration.ofMinutes( x ) ) 
;

時間

其他答案是正確的,尤其是Borgwardt 的答案 但是這些答案使用過時的遺留類。

與 Java 捆綁的原始日期時間類已被 java.time 類取代。 在 java.time 類型中執行您的業務邏輯。 僅在需要處理尚未更新以處理 java.time 類型的舊代碼時才轉換為舊類型。

如果您的Calendar實際上是GregorianCalendar您可以轉換為ZonedDateTime 查找添加到舊類中的新方法,以方便與 java.time 類型之間的轉換。

if( myUtilCalendar instanceof GregorianCalendar ) {
    GregorianCalendar gregCal = (GregorianCalendar) myUtilCalendar; // Downcasting from the interface to the concrete class.
    ZonedDateTime zdt = gregCal.toZonedDateTime();  // Create `ZonedDateTime` with same time zone info found in the `GregorianCalendar`
end if 

如果您的Calendar不是Gregorian ,請調用toInstant以獲取Instant對象。 Instant類表示UTC時間軸上的一個時刻,分辨率為納秒

Instant instant = myCal.toInstant();

同樣,如果從java.util.Date對象開始,則轉換為Instant Instant類表示UTC時間軸上的一個時刻,分辨率為納秒(最多九 (9) 位小數)。

Instant instant = myUtilDate.toInstant();

應用時區以獲取ZonedDateTime

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

要獲得java.util.Date對象,請通過Instant

java.util.Date utilDate = java.util.Date.from( zdt.toInstant() );

有關在遺留日期時間類型和 java.time 之間轉換的更多討論以及漂亮的圖表,請參閱對另一個問題的回答

Duration

將時間跨度表示為Duration對象。 您輸入的持續時間是問題中提到的分鍾數。

Duration d = Duration.ofMinutes( yourMinutesGoHere );

您可以將其添加到開始以確定停止。

Instant stop = startInstant.plus( d ); 

關於 java.time

java.time框架內置於 Java 8 及更高版本中。 這些類取代麻煩的老傳統日期時間類,如java.util.DateCalendar ,和SimpleDateFormat

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

要了解更多信息,請參閱Oracle 教程 並在 Stack Overflow 上搜索許多示例和解釋。 規范是JSR 310

從哪里獲得 java.time 類?

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

就像是

movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000);

這是一個關於如何將日期轉換為不同類型的完整示例:

Date date = Calendar.getInstance().getTime();

    // Display a date in day, month, year format
    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    String today = formatter.format(date);
    System.out.println("Today : " + today);

    // Display date with day name in a short format
    formatter = new SimpleDateFormat("EEE, dd/MM/yyyy");
    today = formatter.format(date);
    System.out.println("Today : " + today);

    // Display date with a short day and month name
    formatter = new SimpleDateFormat("EEE, dd MMM yyyy");
    today = formatter.format(date);
    System.out.println("Today : " + today);

    // Formatting date with full day and month name and show time up to
    // milliseconds with AM/PM
    formatter = new SimpleDateFormat("EEEE, dd MMMM yyyy, hh:mm:ss.SSS a");
    today = formatter.format(date);
    System.out.println("Today : " + today);

在 Kotlin 中將日期轉換為日歷的擴展。

fun Date?.toCalendar(): Calendar? {
    return this?.let { date ->
        val calendar = Calendar.getInstance()
        calendar.time = date
        calendar
    }
}

暫無
暫無

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

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