我想得到本周第一天的日期。所以我以这种方式实现它:
fun getFirstDayInCurrentWeek(): Date {
val calendar = Calendar.getInstance()
calendar.clear(MILLISECOND)
calendar.clear(SECOND)
calendar.clear(MINUTE)
calendar.set(HOUR_OF_DAY, 0)
calendar.set(DAY_OF_WEEK, 1)
return calendar.time
}
它适用于大多数设备,但有时它会返回下周第一天的日期。我想不通为什么。
这些课程来自java.util.*
.
编辑:只需记录今天(28.05.2018(此功能的结果,您将看到27.05.2018或03.06.2018。设备具有相同的区域设置和时区。
如果我理解正确,您要将星期日视为一周的第一天(如在美国(。
WeekFields wf = WeekFields.SUNDAY_START;
LocalDate today = LocalDate.now(ZoneId.of("Europe/Warsaw"));
LocalDate firstDayOfThisWeek = today.with(wf.dayOfWeek(), 1);
System.out.println(firstDayOfThisWeek);
我正在编写 Java 代码,并相信您会转换为 Kotlin。今天(5月29日星期二(运行,这张印刷品
2018年05月27
日
如果您希望星期一作为一周的第一天(如波兰和国际标准所说(,只需使用WeekFields.ISO
而不是WeekFields.SUNDAY_START
.如果您希望它依赖于区域设置,请使用例如WeekFields.of(Locale.forLanguageTag("pl-PL"))
。
另一个可能更明确的选择是:
LocalDate firstDayOfThisWeek = today
.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));
在这两种情况下,我都使用java.time
,现代Java日期和时间API。我认为这是一个很好的例子,说明它提供了更清晰的代码,与旧的日期和时间类(如Calendar
(相比,情况通常如此。
您的代码中出了什么问题?
据我了解文档,您的代码应该给出本周的星期日。Calendar
使用 1 表示星期日。您可能已经使用calendar.set(DAY_OF_WEEK, SUNDAY)
来获得完全相同的结果。当我今天运行它时,当使用星期日作为一周的第一天时,我会得到 5 月 27 日,当使用星期一作为第一天时,我会得到 6 月 3 日(这意味着星期日是一周的最后一天(。但是,文档不是很清楚,并且Calendar
类可能会令人困惑。无论如何,当您尝试使用不同的设备时,可能这也是发生的事情:它们对周的定义不同。如果可以单独配置周定义,即使它们具有相同的区域设置,也可能发生这种情况。
问:我可以在 Android 上使用 java.time 吗?
是的,java.time
在较旧和较新的Android设备上运行良好。它只需要至少Java6。
- 在Java 8及更高版本以及较新的Android设备上(我被告知从API级别26开始(,现代API是内置的。
- 在Java 6和7中获取ThreeTen Backport,新类的反向移植(JSR 310的ThreeTen;请参阅底部的链接(。
- 在(较旧的(Android上使用Android版本的ThreeTen Backport。它被称为ThreeTenABP。并确保从带有子包的
org.threeten.bp
导入日期和时间类。
链接
- Oracle 教程:解释如何使用
java.time
的日期时间。 - Java 规范请求 (JSR( 310,其中首次描述了
java.time
。 - ThreeTen Backport 项目,将
java.time
向 Java 6 和 7 的反向移植(JSR-310 为 ThreeTen(。 - ThreeTenABP,ThreeTen Backport 的安卓版
- 问:如何在Android项目中使用ThreeTenABP,并进行了非常详尽的解释。
不同国家/地区每周的第一天是不同的。如果您希望所有用户都相同,则可以将Locale
传递给Calendar
。
Calendar currentCalendar = Calendar.getInstance(new Locale("en","UK"));
同样从这个答案中,您可以使用方法setFirstDayOfWeek((来设置一周的第一天。该方法只能影响 WEEK_OF_MONTH 或 WEEK_OF_YEAR 的返回值。对于DAY_OF_WEEK来说,它什么也没做。
您可以实现如下内容:
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);
int rec = cal.get(Calendar.WEEK_OF_MONTH);
System.out.println(rec);
在此处阅读有关 API 的更多信息