我目前正在将Joda-Time的一些代码更改为使用三十Android Backport。
以下所有方法都将long
用作参数并返回long
使用JodaTime可以轻松完成一周的开始和结束:
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
的获取方法以及每周开始和结束时间的任何线索。
答案 0 :(得分:0)
要获得一天的开始和结束,我将使用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);
答案 1 :(得分:0)
我们没有得到全部了解,所以我的建议可能不是重点,但让我尝试。
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.的答案中那样引入一个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 [欧洲/哥本哈根]独家