日历返回错误的一周

时间:2018-06-17 15:07:39

标签: android calendar android-calendar dayofweek java.util.calendar

所以我需要花费本周一的毫秒时间和本周星期日的毫秒时间,并且使用下面的代码工作正常,直到我在模拟器上安装app并且如果我将时间设置为星期日它返回{{1但是在三星Galaxy s5上它会返回Jun 18 - Jun 24我做错了吗?

Jun 11 - Jun 17 <- this is how it should show方法返回星期一的时间(以毫秒为单位)

getMondayTime

private fun getMondayTime(): Long{ val calendar = Calendar.getInstance() calendar.timeInMillis = System.currentTimeMillis() calendar.firstDayOfWeek = Calendar.MONDAY calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY) calendar.set(Calendar.HOUR_OF_DAY, 0) calendar.set(Calendar.MINUTE, 0) calendar.set(Calendar.SECOND, 0) calendar.set(Calendar.MILLISECOND, 0) return calendar.timeInMillis } 返回星期日的时间(以毫秒为单位)

getSundayTime

我将所有这些时间都放在了地方

private fun getSundayTime(): Long {
    val calendar = Calendar.getInstance()
    calendar.timeInMillis = System.currentTimeMillis()
    calendar.firstDayOfWeek = Calendar.MONDAY
    calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY)
    calendar.set(Calendar.HOUR_OF_DAY, 22)
    calendar.set(Calendar.MINUTE, 0)
    calendar.set(Calendar.SECOND, 0)
    calendar.set(Calendar.MILLISECOND, 0)

    return calendar.timeInMillis
}

1 个答案:

答案 0 :(得分:1)

java.time

对不起,我不能写Kotlin(如果那是你的语言?)所以我必须相信你能从Java翻译。现代解决方案是:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MMM d", Locale.ENGLISH);
    // Time zone is crucial for controlling which week we get.
    ZoneId zone = ZoneId.of("America/Lower_Princes");
    WeekFields wf = WeekFields.ISO; // Monday is first day of week
    LocalDate today = LocalDate.now(zone);
    ZonedDateTime mondayTime = today.with(wf.dayOfWeek(), 1).atStartOfDay(zone);
    ZonedDateTime sundayTime = today.with(wf.dayOfWeek(), 7)
            .atTime(LocalTime.of(22, 0))
            .atZone(zone);
    String label = mondayTime.format(dateFormatter) + " - " + sundayTime.format(dateFormatter);
    System.out.println("Label:                 " + label);
    System.out.println("Monday time in millis: " + mondayTime.toInstant().toEpochMilli());
    System.out.println("Sunday time in millis: " + sundayTime.toInstant().toEpochMilli());

刚刚(星期一)开始打印:

Label:                 Jun 18 - Jun 24
Monday time in millis: 1529294400000
Sunday time in millis: 1529892000000

在撰写本文时,它仍然是太平洋上很少时区的星期天。所以我也试过其中一个:

    ZoneId zone = ZoneId.of("Pacific/Niue");

然后我上周得到了:

Label:                 Jun 11 - Jun 17
Monday time in millis: 1528714800000
Sunday time in millis: 1529312400000

因此,指定正确的时区对于获得所需的一周至关重要。我怀疑这是你问题中的问题:如果你的模拟器被设置为使用一个时区,当你运行你的代码时它已经是星期一,那么就像你观察到的那样,它会给你即将到来的一周。

我正在使用并推荐java.time,现代Java日期和时间API。

问题:我可以在Android上使用java.time吗?

是的,java.time适用于较旧和较新的Android设备。它只需要至少Java 6

  • 在Java 8及更高版本和更新的Android设备上(来自API级别26,我被告知)现代API内置。
  • 在Java 6和7中获取ThreeTen Backport,新类的后端端口(适用于JSR 310的ThreeTen;请参阅底部的链接)。
  • On(较旧)Android使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

如果您反对依赖外部库,即使是像ThreeTenABP这样面向未来的库 - 我的意思是,它是由为Java开发java.time的人开发的,它只包含同样的功能一旦升级到API级别26或更高级别,就会包含在核心Java中 - 在这种情况下,您可以通过将正确的TimeZone对象传递给Calendar.getInstance(TimeZone)方法(我还没有尝试过)来解决您的问题。 TimeZone是过时的日期和时间类别之一。

链接