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;
添加回答
举报