当前位置: 首页 > 知识库问答 >
问题:

如何在Android中获取另一时区中一天的开始时间和结束时间

楚畅
2023-03-14

我的日期格式为:YYYY-MM-DD

所需的输出格式是:"yyyy-MM-dd'T'HH: mm: ss.SSS'Z'"

我想在美国/芝加哥时区获得ISO格式的日期,作为一天的开始时间(从上午12:00开始)和一天的结束时间(结束于晚上11:59)。

对于eg.日期: 2020-06-08(6月8日)转换后的最终输出如下:

当天开始时间为日期: 2020-06-08T05:00:00.000Z

截止日期当日的结束时间:2020-06-09T04:59:59.999Z

如果有人对此有任何线索,请帮助我。

答:http://m.uploadedit.com/bltc/1591511729781.txt

共有2个答案

崔高远
2023-03-14

更新:

    ZoneId zoneId = ZoneId.of("America/Chicago");
    LocalDate localDate = LocalDate.parse("2020-06-08");
    DateTimeFormatter newPattern = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZone(zoneId);
    Instant startOfDay = localDate.atStartOfDay(zoneId).toInstant();
    Instant endOfDay = LocalDateTime.of(localDate, LocalTime.MAX).atZone(zoneId).toInstant().truncatedTo(ChronoUnit.MILLIS);
    System.out.println(startOfDay);
    System.out.println(endOfDay);

根据我所经历的,分数000不会出现在这里,但是可以肯定的是,如果没有分数毫秒,那么它就是000。在格式化时,我不知道如何将其显示出来。如果您找到了某个内容,请添加其他内容,您可以通过将startDate转换为字符串,然后将000追加到该内容来完成此操作。

结果

    2020-06-08T05:00:00Z
    2020-06-09T04:59:59.999Z
谭新知
2023-03-14

我建议使用java.time,现代Java日期和时间API,用于这样的日期和时间数学。

    ZoneId zone = ZoneId.of("America/Chicago");

    String dateString = "2020-06-08";
    LocalDate date = LocalDate.parse(dateString);
    Instant startOfDay = date.atStartOfDay(zone).toInstant();
    Instant endOfDay = date.plusDays(1).atStartOfDay(zone).toInstant();

    System.out.println("The day is from " + startOfDay + " (inclusive) to " + endOfDay + " (exclusive)");

输出为:

日期为2020-06-08T05:00:00Z(含)至2020-06-09T05:00:00Z(不含)

为了不排除一天中的最后一毫秒,我们需要将一天计算为持续到第二天的第一刻。如果你坚持要减去一毫秒或一纳秒,当然,这取决于你自己。例如:

    Instant endOfDay = date.plusDays(1).atStartOfDay(zone).minusNanos(1).toInstant();

当天从2020-06-08T05:00:00Z(含)到2020-06-09T04:59:59.999999999Z(含1纳米以上)

编辑:如何在输出中打印毫秒?你很可能不需要这个。您要求的格式是国际标准ISO 8601(见底部的链接)。在ISO 8601中,秒的分数是可选的,省略它意味着0。因此,任何需要ISO8601的API都应该接受上述要求。如果不是,正确的解决方案是使用格式化程序。在这种情况下,我们需要将时间显式转换为UTC:

    ZoneId zone = ZoneId.of("America/Chicago");
    DateTimeFormatter formatterWithMillis = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX");

    String dateString = "2020-06-08";
    LocalDate date = LocalDate.parse(dateString);
    OffsetDateTime startOfDay = date.atStartOfDay(zone)
            .toOffsetDateTime()
            .withOffsetSameInstant(ZoneOffset.UTC);
    OffsetDateTime endOfDay = date.plusDays(1)
            .atStartOfDay(zone)
            .toOffsetDateTime()
            .withOffsetSameInstant(ZoneOffset.UTC);

    String startString = startOfDay.format(formatterWithMillis);
    String endString = endOfDay.format(formatterWithMillis);
    System.out.println("The day is from " + startString + " (inclusive) to " + endString + " (exclusive)");

日期为2020-06-08T05:00:00.000Z(含)至2020-06-09T05:00:00.000Z(不含)

或在结束时间减去纳秒后,如前所述:

    OffsetDateTime endOfDay = date.plusDays(1)
            .atStartOfDay(zone)
            .minusNanos(1)
            .toOffsetDateTime()
            .withOffsetSameInstant(ZoneOffset.UTC);

这一天是从2020-06-08T05:00:00.000Z(包括)到2020-06-09T04:59:59.999Z(包括和1纳米以上)

(由于时间被截断为整毫秒,1nano更多没有真正意义,但我认为这不是重点。)

time在较旧和较新的Android设备上都能很好地工作。它至少需要Java6。

  • 在Java 8和更高版本以及更新的Android设备(API级别26)上,内置了现代API。

但是除了切换到ThreeTenBP库,我们没有其他选择吗?

如果您坚持,我想可以找到一种使用日历日期简单格式的方法。这些类设计得很糟糕,而且很早就过时了,所以根据我所知道和不知道的,我更喜欢ThreeTenABP。

  • Oracle教程:解释如何使用java.time.日期时间
  • Java规范请求(JSR)310,其中首次描述了java.time
  • Threeten Backport项目,是java.time到Java6和7的Backport(用于JSR-310的Threeten)。
  • ThreeTenABP, Android版的Threeten Backport
  • 问题:如何在Android项目中使用ThreeTenABP,有一个非常彻底的解释。
  • 维基百科文章:ISO 8601
 类似资料:
  • 我有一个enum,其值如下:,,等。 我试图编写一个方法,它接受并返回该时间段的开始和结束日期。 我研究了新的Java8类,该类可能需要一个开始时间和结束时间,但似乎没有任何干净的方法可以在之后检索这些值。 如果不使用(似乎是错误的数据结构)或一些难看的日期时间算法,我如何能一次干净地返回开始日期和结束日期?

  • 我想从JavaGUI到数据库获取startTime和endTime的值。 电脑座位班 Cobadatabase类 这里的问题是,当单击登录按钮时,开始时间显示在我的数据库中的开始时间和结束时间列上。当单击注销按钮时,将在数据库中创建另一个行,该行在starTime和endTime列上都包含endTime。我想知道为什么会这样...

  • 问题内容: 我想知道如何计算本周的开始和结束日期?我发现这不是在标准android库或date4j之类的库中实现的。 是否有一些简单明了的实现方法?还是我必须再次骑自行车? 谢谢。 问题答案: 也许MonthDisplayHelper可能对您有所帮助。 祝好运!

  • 问题内容: 我想为FIFA2014世界杯比赛创建一个警报应用程序,在该应用程序中我有一个服务器,用于在巴西/英亩存储比赛的日期和时间,并且我的客户端是android应用程序,而android设备可能具有任何可能的时区所以我的问题是我想将巴西/英亩的时间转换为具有不同时区的本地android设备的时间,经过大量的谷歌搜索后,我开始了解joda数据和时间库,但是在android中它太慢了,所以请提出任

  • 我正在尝试获取PST时区中一天的开始时间(00:00:00)和结束时间(23:59:59)。我尝试了以下代码,但由于某种原因,我只获取UTC中的开始和结束时间。我尝试将时区更改为包括“美国/Los_angeles”,但输出时间戳始终显示GMT/UTC的开始和结束时间。 我的代码: 输出: 我这里有什么遗漏吗?我应该更新任何包吗。?

  • 给定ZonedDateTime,我如何获得时区所在的一天开始的ZonedDateTime?我不希望一天的开始是UTC。 实例 给定ZoneDateTime。of(2022,6,8,1,0,0,0,ZoneId.of(“美国/纽约”)) 我想返回ZonedDateTime.of(2022, 6, 7, 0, 0, 0, 0, ZoneId.of("America/New_York")) 因为UTC的