【问题标题】:How to get the Start of day and End of Day in UTC Conversation如何在 UTC 对话中获取一天的开始和结束
【发布时间】:2022-11-20 16:39:30
【问题描述】:

你好,我正在尝试一天的开始

就像在印度时区

  • 一天的开始是:2022-11-20 00:00:00(印度当地时间)
  • 在 UTC:2022-11-20 05:30:00 PM

【问题讨论】:

  • 所以您想知道在印度的哪个时间是 0:00 UTC(如示例中所示)?或者您想知道印度一天开始时的 UTC 时间(当地时间 0:00)? ||下午 5:30 有点奇怪——应该是 17:30(24 小时制)
  • 印度当天开始的 UTC 时间(当地时间 0:00)
  • LocalDate 有一个方法 atSatrtOfDay(ZoneId) ...

标签: java android kotlin timezone datetime-conversion


【解决方案1】:

tl;博士

LocalDate                                      // Represent a date-only value, without time-of-day, without time zone or offset.
.now( ZoneId.of( "Asia/Kolkata" ) )            // Capture the current date as seen in a particular time zone. For any given moment, the date varies around the globe by time zone. 
.atStartOfDay( ZoneId.of( "Asia/Kolkata" ) )   // Determine the first moment of the day. May or may not be 00:00. Returns a `ZonedDateTime` object.
.toInstant()                                   // Adjust to an offset from UTC of zero hours-minutes-seconds. Returns an `Instant` object.
.toString()                                    // Generate text in standard ISO 8601 format. Returns a `String` object, containing formatted text.

2022/11/19 18:30:00

细节

捕获当前日期。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
LocalDate today = LocalDate.now( z ) ;

获取当天的第一刻。做不是假设这一天从 00:00 开始。某些时区某些日期的某些日子从一天中的不同时间开始,例如 01:00。让java.time确定第一时刻。

ZonedDateTime zdt = today.atStartOfDay( z ) ;

要通过 UTC 挂钟时间查看同一时刻(与 UTC 的零小时-分钟-秒的偏移量),请提取 InstantInstant 代表一个时刻,时间轴上的一个特定点,如 UTC 所示。

Instant instant = zdt.toInstant() ;

查看在 Ideone.com 上运行的代码。

today.toString(): 2022-11-20
zdt.toString(): 2022-11-20T00:00+05:30[Asia/Kolkata]
instant.toString(): 2022-11-19T18:30:00Z

Java 8+ 附带了一个实现java.time.适用于 Android 26+ 的同上。对于早期的 Android,最新的工具提供了大部分java.time通过“API 脱糖”功能。

【讨论】:

  • 但它适用于 Android Oreo 之上。下面版本的设备呢
  • 选项:withZoneSameInstant(ZoneOffset.UTC)而不是toInstant()
  • @Arjunsaini 请参阅答案底部的编辑。
  • @user16320675 不,我不推荐这种方法。结果是 ZonedDateTime,它在技术上有效但具有误导性。仅具有偏移量而不是时区的日期时间对象应使用 OffsetDateTime。对于仅限 UTC 的值,Instant 适用于不需要灵活性(例如生成各种格式的文本)的情况。
  • @user16320675 我可以建议妥协吗? :-) OffsetDateTimeInstant 的优势在于它可以被格式化(就像 OP 要求 2022-11-20 05:30:00 PM 时一样)。我们不需要ZonedDateTIme
猜你喜欢
  • 2012-01-28
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
相关资源
最近更新 更多