提问人:Kyle 提问时间:6/25/2019 更新时间:6/25/2019 访问量:254
w/ ThreeTenBackport 的一周开始和结束
Start and End of Week w/ ThreeTenBackport
问:
我目前正在更改 Joda-Time 中的一些代码以使用 Three-Ten Android Backport。
以下所有方法都采用 a 作为参数并返回long
long
使用 JodaTime 获得一周的结束和开始,使用 Joda-Time 是直截了当的:
LocalDate(long time).dayOfWeek().withMaximumValue()
LocalDate(long time).dayOfWeek().withMinimumValue()
一天的结束和开始也存在同样的问题,Joda-Time:
DateTime(long time).withTimeAtStartOfDay().getMillis() + DateUtils.DAY_IN_MILLIS - 1
DateTime(long time).withTimeAtStartOfDay().getMillis()
但是,我不明白如何以这种方式使用threeTenAbp。
结束和开始的一个想法:
一天结束:
LocalDateTime dt = DateTimeUtils.toLocalDateTime(new Timestamp(time));
ZonedDateTime zdt = ZonedDateTime.of(dt, ZoneId.systemDefault());
return zdt.with(LocalTime.MAX).toEpochSecond();
一天的开始时间:
LocalDateTime dt = DateTimeUtils.toLocalDateTime(new Timestamp(long time));
ZonedDateTime zdt = ZonedDateTime.of(dt, ZoneId.systemDefault());
return zdt.toLocalDate().atStartOfDay(ZoneId.systemDefault()).toEpochSecond();
这似乎非常复杂,并没有真正为我提供任何关于如何获取和时间的线索,以及与传递给函数相关的一周的开始和结束时间。long time
答:
为了获得一天的开始和结束,我将使用该方法,传入一个预定义的实例:with()
LocalTime
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime startOfDay = ldt.with(LocalTime.MIN); // 00:00:00
LocalDateTime endOfDay = ldt.with(LocalTime.MAX); // 23:59:59
要获得一周的第一天和最后一天,您可以做同样的事情,但您必须首先定义“一周”的含义。一些地区认为一周从星期一开始,而另一些地方则认为从星期日开始。
在美国,周从周日开始。我们可以通过使用以下方法获得表示这一点:TemporalField
WeekFields.of()
WeekFields usWeek = WeekFields.of(Locale.US);
然后,我们可以通过将该字段分别设置为 和 来获取一周的第一天和最后一天:1
7
LocalDateTime firstDayOfWeek = ldt.with(usWeek.dayOfWeek(), 1);
LocalDateTime lastDayOfWeek = ldt.with(usWeek.dayOfWeek(), 7);
我们没有得到全貌,所以我的建议可能不切中要害,但让我尝试一下。
long millisSinceEpoch = 1_555_555_555_555L;
LocalDate date = Instant.ofEpochMilli(millisSinceEpoch)
.atZone(ZoneId.systemDefault())
.toLocalDate();
LocalDate firstDayOfWeek = date.with(DayOfWeek.MONDAY);
LocalDate lastDayOfWeek = date.with(DayOfWeek.SUNDAY);
System.out.println("Week is from " + firstDayOfWeek + " through " + lastDayOfWeek);
一周是从 2019-04-15 到 2019-04-21
我假设你想要 ISO 周,也就是说,星期一是一周的第一天(我想这就是你的 Joda-Time 代码给你的)。如果没有,你需要引入一个对象,就像 Ben P. 的回答一样。我建议您不要想转换回.A更适合继续工作。WeekFields
long
LocalDate
新的一天开始:
ZonedDateTime startOfDay = date.atStartOfDay(ZoneId.systemDefault());
System.out.println("Start of day: " + startOfDay);
在我的时区,我得到:
开始时间:2019-04-18T00:00+02:00[欧洲/哥本哈根]
同样,保留您的对象,而不是转换为毫秒。ZonedDateTime
不要计算一天的结束。对于一天结束的时间点(“午夜”),请始终使用一天的开始时间。
ZonedDateTime startOfNextDay = date.plusDays(1)
.atStartOfDay(ZoneId.systemDefault());
System.out.println("Day is from " + startOfDay + " inclusive to " + startOfNextDay + " exclusive");
日子是从 2019-04-18T00:00+02:00[欧洲/哥本哈根] 包括 2019-04-19T00:00+02:00[欧洲/哥本哈根]独家
评论
long
DateTime
LocalDateTime
ZonedDateTime
OffsetDateTime
Timestamp