Android 每周开始和结束时,带ThreeTenBackport
我目前正在将一些代码从Joda Time更改为使用Three-Ten Android Backport 以下所有方法都将Android 每周开始和结束时,带ThreeTenBackport,android,datetime,jodatime,threetenbp,Android,Datetime,Jodatime,Threetenbp,我目前正在将一些代码从Joda Time更改为使用Three-Ten Android Backport 以下所有方法都将long作为参数,并返回long 与JodaTime一起获得本周的结束和开始是与Joda Time一起进行的: LocalDate(long time).dayOfWeek().withMaximumValue() LocalDate(long time).dayOfWeek().withMinimumValue() DateTime(long time).withTimeA
long
作为参数,并返回long
与JodaTime一起获得本周的结束和开始是与Joda Time一起进行的:
LocalDate(long time).dayOfWeek().withMaximumValue()
LocalDate(long time).dayOfWeek().withMinimumValue()
DateTime(long time).withTimeAtStartOfDay().getMillis() + DateUtils.DAY_IN_MILLIS - 1
DateTime(long time).withTimeAtStartOfDay().getMillis()
同样的问题也出现在一天的结束和开始,以及Joda时间:
LocalDate(long time).dayOfWeek().withMaximumValue()
LocalDate(long time).dayOfWeek().withMinimumValue()
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();
这似乎很复杂,并没有为我提供任何线索,说明如何获取传递到函数中的
长时间
,以及一周开始和结束的时间 要获得一天的开始和结束,我将使用with()
方法,传入一个预定义的LocalTime
实例:
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime startOfDay = ldt.with(LocalTime.MIN); // 00:00:00
LocalDateTime endOfDay = ldt.with(LocalTime.MAX); // 23:59:59
为了得到一周的第一天和最后一天,你可以做同样的事情,但是你必须首先定义你所说的“一周”是什么意思。一些地区考虑在星期一开始一周,其他人认为它从星期日开始。
在美国,一周从周日开始。我们可以通过使用WeekFields.of()
,找到表示这一点的TemporalField
:
然后,我们可以通过将该字段分别设置为1
和7
来获取一周的第一天和最后一天:
LocalDateTime firstDayOfWeek = ldt.with(usWeek.dayOfWeek(), 1);
LocalDateTime lastDayOfWeek = ldt.with(usWeek.dayOfWeek(), 7);
为了获得一天的开始和结束,我将使用
with()
方法,传入一个预定义的LocalTime
实例:
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime startOfDay = ldt.with(LocalTime.MIN); // 00:00:00
LocalDateTime endOfDay = ldt.with(LocalTime.MAX); // 23:59:59
为了得到一周的第一天和最后一天,你可以做同样的事情,但是你必须首先定义你所说的“一周”是什么意思。一些地区考虑在星期一开始一周,其他人认为它从星期日开始。
在美国,一周从周日开始。我们可以通过使用WeekFields.of()
,找到表示这一点的TemporalField
:
然后,我们可以通过将该字段分别设置为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时间代码给你的)。如果没有,您需要引入一个WeekFields
对象,如Ben P.的答案所示。我建议您不要转换回long
。一个LocalDate
更适合继续工作
一天的开始:
ZonedDateTime startOfDay = date.atStartOfDay(ZoneId.systemDefault());
System.out.println("Start of day: " + startOfDay);
在我的时区,我得到:
一天的开始时间:2019-04-18T00:00+02:00[欧洲/哥本哈根]
同样,保留ZoneDateTime
对象,而不是转换为毫秒
不要计算一天的结束。对于一天过去的时间点(“午夜”),始终使用一天的开始
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 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时间代码给你的)。如果没有,您需要引入一个WeekFields
对象,如Ben P.的答案所示。我建议您不要转换回long
。一个LocalDate
更适合继续工作
一天的开始:
ZonedDateTime startOfDay = date.atStartOfDay(ZoneId.systemDefault());
System.out.println("Start of day: " + startOfDay);
在我的时区,我得到:
一天的开始时间:2019-04-18T00:00+02:00[欧洲/哥本哈根]
同样,保留ZoneDateTime
对象,而不是转换为毫秒
不要计算一天的结束。对于一天过去的时间点(“午夜”),始终使用一天的开始
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[欧洲/哥本哈根]独家
现在您正在进行重写,我建议:(1)停止使用
long
作为日期和时间。使用适当的日期时间对象。(2) 不要让一天结束(那一刻无论如何都不存在)。而是从第二天开始。阅读大约一半开放的时间间隔。作为旁白,您不想用LocalDateTime
替换Joda Time的DateTime
。考虑<代码> ZONDATDeTIME/<代码>。或OffsetDateTime
。您不想引入过时的Timestamp
类。现在您正在进行重写,我建议:(1)停止使用long
表示日期和时间。使用适当的日期时间对象。(2) 不要让一天结束(那一刻无论如何都不存在)。而是从第二天开始。阅读大约一半开放的时间间隔。作为旁白,您不想用LocalDateTime
替换Joda Time的DateTime
。考虑<代码> ZONDATDeTIME/<代码>。或OffsetDateTime
。您不想引入过时的Timestamp
类。