1

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

以下所有方法都将 along作为参数并返回 along

使用 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传入函数相关的一周开始和结束的时间和时间。

4

2 回答 2

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通过使用 ahold 来表示这一点WeekFields.of()

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

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

LocalDateTime firstDayOfWeek = ldt.with(usWeek.dayOfWeek(), 1);
LocalDateTime lastDayOfWeek = ldt.with(usWeek.dayOfWeek(), 7);
于 2019-06-24T20:19:27.087 回答
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 代码给你的)。如果没有,您需要WeekFields像 Ben P. 的回答那样引入一个对象。我建议您不要转换回long. ALocalDate更适合继续工作。

一天的开始:

    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[Europe/Copenhagen] 包含到 2019-04-19T00:00+02:00[Europe/Copenhagen] 不包含

于 2019-06-25T03:23:34.207 回答