簡體   English   中英

Android Java:當前時間與未來具體時間之差計算錯誤

[英]Android Java : Difference between current time and specific time in future is calculated wrong

我需要當前時間和未來特定時間之間的差異,以便我可以將倒數計時器作為參數傳遞。 我有此操作的 function 但它計算錯誤。 這是我的 function 計算差異

   public Date RetriveLeftTime(Date incomingTime) {

    DateFormat milisFormat = new SimpleDateFormat("HH:mm:ss");
    Date moment = Calendar.getInstance().getTime();
    milisFormat.format(moment);
    Date configuredTime = ConfigureTime(incomingTime);
    milisFormat.format(configuredTime);
    long leftTime =configuredTime.getTime()-moment.getTime();

    Date result = new Date(leftTime);
    result = ConfigureTime(result);

    Log.d("Result",result.toString());

    return result;

}

用於配置日期詳細信息的 ConfigureTime() function

public Date ConfigureTime(Date date){

    Calendar today = Calendar.getInstance();
    int date = today.get(Calendar.DATE);
    int year = today.get(Calendar.YEAR);
    int day = today.get(Calendar.DAY_OF_WEEK);
    int month = today.get(Calendar.MONTH);
    int zone = today.get(Calendar.ZONE_OFFSET);

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

    time.set(Calendar.YEAR, year);
    time.set(Calendar.MONTH, month);
    time.set(Calendar.DAY_OF_WEEK, day);
    time.set(Calendar.DATE, date);
    time.set(Calendar.ZONE_OFFSET,zone);

    Log.d("ConfigureTime()",time.getTime().toString());
    Log.d("Current Time",today.getTime().toString());

    return time.getTime();
}

我看過關於這個問題的類似帖子。我檢查並配置了我所有的時間規范,如時區、日期、年份,但仍然得到錯誤的結果。我不明白為什么會發生。也許我的代碼做錯了我不這樣做不知道。 我做錯了什么? 大多數人建議使用 joda 時間,但我在切換 joda 時間方面做得太過分了。在切換到 joda 時間之前有解決方案嗎?

tl;博士

Duration
.between(
    Instant.now() ,
    myJavaUtilDate.toInstant()
)
.toMillis()

java.time

您正在使用幾年前被 JSR 310 中定義的現代java.time類取代的糟糕類。切勿使用CalendarDateSimpleDateFormat

Instant

如果您java.util.Date object,請立即轉換為Instant object。 使用添加到舊類的新轉換方法。

Instant then = myJavaUtilDate.toInstant() ;

Instant表示“以 UTC 為單位”的時刻,偏移量為零時分秒。

捕捉以 UTC 顯示的當前時刻。

Instant now = Instant.now() ;

計算經過的時間。

Duration d = Duration.between( now , then ) ;

驗證您的目標時刻確實在未來。

if( d.isNegative() ) { … deal with faulty input … }

通常最好傳遞一個Duration object 而不是僅僅計算毫秒或納秒的 integer。 但如果需要,您可以從Duration object 中提取計數。

long milliseconds = d.toMillis() ;

請注意,通過使用 UTC,我們無需處理任何時區問題。

Android

如果使用 Android 26+,則此功能是內置的。 對於早期的 Android,最新的工具通過“API 脫糖”帶來了大部分功能。

暫無
暫無

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

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