Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 每周开始和结束时,带ThreeTenBackport_Android_Datetime_Jodatime_Threetenbp - Fatal编程技术网

Android 每周开始和结束时,带ThreeTenBackport

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

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

以下所有方法都将
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
类。