带ThreeTenBackport的一周的开始和结束

时间:2019-06-24 19:40:19

标签: android datetime jodatime threetenbp

我目前正在将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的获取方法以及每周开始和结束时间的任何线索。

2 个答案:

答案 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);

然后通过将该字段分别设置为17,可以得到一周的第一天和最后一天:

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对象。建议您不要转换回longLocalDate更好地配合工作。

对于一天的开始:

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

相关问题