3 回答

TA貢獻1820條經驗 獲得超10個贊
java.time
我建議使用以下兩種方法的實現。
public static long getStartTimeOfWeek() {
WeekFields wf = WeekFields.of(Locale.getDefault());
return LocalDate.now(ZoneOffset.UTC)
.with(wf.dayOfWeek(), 1)
.atStartOfDay(ZoneOffset.UTC)
.toInstant()
.toEpochMilli();
}
public static long getMonthDateFirstdate(){
return YearMonth.now(ZoneOffset.UTC)
.atDay(1)
.atStartOfDay(ZoneOffset.UTC)
.toInstant()
.toEpochMilli();
}
要試用它們,
System.out.println(Instant.ofEpochMilli(getStartTimeOfWeek()));
System.out.println(Instant.ofEpochMilli(getMonthDateFirstdate()));
當我剛才在計算機上運行這兩行時,我得到了:
2019-03-18T00:00:00Z
2019-03-01T00:00:00Z
由于您的預期和觀察到的輸出都提到了UTC,因此我假設您希望使用UTC進行操作。由于星期一是我所在地區一周的第一天,因此我在第一行中得到了3月18日星期一。
我建議你避免上課。該類設計不佳,并且早已過時,因此對于像您這樣的不太平凡的日期和時間操作來說,這是一個糟糕的工具。相反,我使用的是java.time,即現代Java日期和時間API。它對你正在做的事情有更好的支持,而且通常也更適合使用。Calendar
您的代碼中出了什么問題?
我們并不完全清楚為什么你會得到你得到的結果,因為你沒有提供一個完整的例子,因為你的代碼的行為取決于時區和區域設置。潛在問題包括:
您得到的一個可能的解釋是,您在UTC偏移量+05:30的時區運行代碼,例如亞洲/加爾各答或亞洲/科倫坡。在這個時區,您已經開始了新的一天。它與 UTC 時間前一天的 18:30 相同。
18:30:00 UTC 6:30 pm
12:47:15 UTC 12:47 pm
看起來很奇怪。它可能來自您的常量具有不正確的值。ONE_DAY
cal.set(Calendar.DAY_OF_WEEK, 1);
將星期幾設置為 1 = 星期日(如果我沒記錯這些常量,我永遠無法確定),但在某些區域設置中,將選擇上一個星期日,在其他語言環境中,將選擇下一個星期日,而在其他區域設置中,它將隨當前星期天而變化。似乎在你忘了設置一天中的小時數。很容易忘記類,你必須單獨設置每個字段(很高興你記得毫秒,許多人忘記了那些)。
getMonthDateFirstdate
Calendar
使用半開間隔。與其希望結束時間,不如將其設置為開放終結點并將其用作開放終結點,也就是說,您的間隔是從開始時間(包括)到結束時間(不含))。因此,這意味著只有當時間點嚴格早于結束時間時,它才在區間內。
Sun, 31 Mar 2019 23:59:59 UTC 11:59 pm
Mon, 01 Apr 2019 00:00:00 UTC 12:00 am
問:我可以在 Android API 級別 20 上使用 java.time 嗎?
是的,在較舊和較新的Android設備上運行良好。它只需要至少Java 6。java.time
在Java 8及更高版本以及新的Android設備上(我被告知,從API級別26開始),新的API是內置的。
在Java 6和7中,獲得ThreeTen Backport,即新類的向后移植(ThreeTen for JSR 310,其中首次描述了現代API)。
在(較舊的)Android上,使用Android版本的ThreeTen Backport。它被稱為ThreeTenABP。確保從包和子包中導入日期和時間類。
org.threeten.bp

TA貢獻1806條經驗 獲得超5個贊
試試這個:
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.DAY_OF_WEEK, 1);
return cal.getTimeInMillis()+ ONE_DAY;
添加回答
舉報