w/ ThreeTenBackport 的一周开始和结束

Start and End of Week w/ ThreeTenBackport

提问人:Kyle 提问时间:6/25/2019 更新时间:6/25/2019 访问量:254

问:

我目前正在更改 Joda-Time 中的一些代码以使用 Three-Ten Android Backport。

以下所有方法都采用 a 作为参数并返回longlong

使用 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

Android 日期时间 jodatime threetenbp

评论

0赞 Anonymous 6/25/2019
现在您正在重写,我建议:(1)停止使用日期和时间。使用正确的日期时间对象。(2)不要结束一天(反正那一刻不存在)。取而代之的是第二天的开始。阅读有关半开间隔的信息。long
0赞 Anonymous 6/25/2019
顺便说一句,您不想用 .考虑。或。而且你不想引入过时的类。DateTimeLocalDateTimeZonedDateTimeOffsetDateTimeTimestamp

答:

0赞 Ben P. 6/25/2019 #1

为了获得一天的开始和结束,我将使用该方法,传入一个预定义的实例:with()LocalTime

LocalDateTime ldt = LocalDateTime.now();
LocalDateTime startOfDay = ldt.with(LocalTime.MIN); // 00:00:00
LocalDateTime endOfDay = ldt.with(LocalTime.MAX); // 23:59:59

要获得一周的第一天和最后一天,您可以做同样的事情,但您必须首先定义“一周”的含义。一些地区认为一周从星期一开始,而另一些地方则认为从星期日开始。

在美国,周从周日开始。我们可以通过使用以下方法获得表示这一点:TemporalFieldWeekFields.of()

WeekFields usWeek = WeekFields.of(Locale.US);

然后,我们可以通过将该字段分别设置为 和 来获取一周的第一天和最后一天:17

LocalDateTime firstDayOfWeek = ldt.with(usWeek.dayOfWeek(), 1);
LocalDateTime lastDayOfWeek = ldt.with(usWeek.dayOfWeek(), 7);
0赞 Anonymous 6/25/2019 #2

我们没有得到全貌,所以我的建议可能不切中要害,但让我尝试一下。

    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更适合继续工作。WeekFieldslongLocalDate

新的一天开始:

    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[欧洲/哥本哈根]独家