簡體   English   中英

Android Calendar.getTime().getTime() 總是返回 -1 天

[英]Android Calendar.getTime().getTime() always returning -1 day

我通過提供時區然后將日、月和年設置為日歷來創建日歷實例。 但是當我試圖以毫秒為單位獲取時間時,它總是以毫秒為單位返回 dateTime -1 天

這是我如何設置日歷。

DatePickerDialog datePickerDialog = new DatePickerDialog(Objects.requireNonNull(getContext()), R.style.DialogTheme, (view, year, month, dayOfMonth) -> {
        Calendar calendar = new DateUtils().getCountryCalendar();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, (month));
        calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        long selectedDate = calendar.getTime().getTime();
    }, mYear, mMonth, mDay);

我正在設置 bu 它返回我selectedDate1624986000000星期二 2021 年 6 月 29 日 22:30:00

這是 getCountryCalendar() 方法。

如果我選擇 6 月 30 日,那么它應該以毫秒為單位返回 6 月 30 日。 我不知道為什么會這樣。 任何建議表示贊賞。

public Calendar getCountryCalendar() {

    return Calendar.getInstance(TimeZone.getTimeZone("Asia/Bangkok"));
}

tl;博士

LocalDate
.of( y , m , d )
.atStartOfDay( ZoneId.of( "Asia/Bangkok" ) )
.toInstant()
.toEpochMilli() 

時間

現代解決方案使用java.time類,該類多年前取代了舊的日期時間類,例如Calendar

建立僅限日期的值。

LocalDate ld = LocalDate.of( y , m , d ) ;

顯然,您希望在特定時區中看到該日期中一天中的第一個時刻。 不要硬編碼 00:00:00.0 的時間。 某些時區的某些日期可能不存在該時間。 java.time確定一天中的第一個時刻。

ZoneId z = ZoneId.of( "Asia/Bangkok" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;

顯然,您想將其轉換為從 UTC 中看到的 1970 年第一時刻的紀元參考開始的毫秒數。 Instant類代表在 UTC 中看到的時刻。

long millis = zdt.toInstant().toEpochMilli() ;

時間戳1624986000000確實是Asia/Bangkok時區的Jun 30, 00:00:00 您甚至可以在這里查看

另一方面,科爾卡塔和科倫坡時區將此時間戳呈現為Jun 29 2021 22:30:00

由於您尚未共享將時間戳轉換為 22:30:00 的代碼,因此我假設在那段代碼中您沒有使用正確的時區(而是Asia/ColcataAsia/Colombo或其他匹配GMT +05:30 )

暫無
暫無

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

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