如何以 GMT 格式获取今天的时间戳 - Kotlin

Posted

技术标签:

【中文标题】如何以 GMT 格式获取今天的时间戳 - Kotlin【英文标题】:How to get today's timestamp in GMT format - Kotlin 【发布时间】:2022-01-19 06:05:43 【问题描述】:

我正在使用以下函数在 kotlin-android 中获取今天的开始时间戳

fun getTimeStampForStartOfTheDay(): String 
    val localDate = LocalDate.now()   // your current date time
    val startOfDay: LocalDateTime = localDate.atStartOfDay() // date time at start of the date
    val timestamp = startOfDay.atZone(ZoneId.systemDefault()).toInstant()
        .epochSecond // start time to timestamp
    return timestamp.toString()

得到的时间戳为:1639593000

格林威治标准时间:2021 年 12 月 15 日星期三 18:30:00

您的时区:2021 年 12 月 16 日星期四 00:00:00 GMT+05:30

亲戚:11 小时前

但时间戳应该是1639612800

格林威治标准时间:2021 年 12 月 16 日星期四 00:00:00

您的时区:2021 年 12 月 16 日星期四 05:30:00 GMT+05:30

亲戚:5 小时前

我怎样才能做到这一点?谢谢。

【问题讨论】:

您想在特定时区(例如印度)捕捉一天的第一刻还是在本初子午线(零时分秒的偏移量)捕捉一天的第一刻? 【参考方案1】:

tl;博士

LocalDate.now( z ).atStartOfDay( z ).toInstant().getEpochSecond() ;

详情

我不确定您的代码出了什么问题,但这似乎是时区问题。

另一个问题是您隐式依赖 JVM 当前的默认时区。任何应用程序的任何线程中的任何代码都可以随时更改该默认值。因此,最好指定您想要或预期的时区。或者至少捕获一次默认值并重复使用,而不是多次访问当前默认值。

而且您的代码过度劳累,跳过了不必要的障碍。

在 Java 语法中:

ZoneId z = ZoneId.systemDefault() ;  // Or specify: ZoneId.of( "Asia/Kolkata" ) ;
LocalDate today = LocalDate.now( z ) ;
ZonedDateTime startOfToday = today.atStartOfDay( z ) ;
Instant instant = startOfToday.toInstant() ;
long countOfSecondsSinceEpochReference = instant.getEpochSecond() ; 

另请参阅my Answer 的类似问题。

【讨论】:

谢谢@Basil 先生。通过使用 atStartOfDay() 获得今天的开始时间。但是你有什么想法:我怎样才能得到今天的结束时间? @JaiminModi 一天的最后一刻是无限可分的,因此很尴尬。最好使用半开放方法来定义时间跨度,其中开始是包容性的,而结束是排斥性的。这允许整齐地邻接跨度而没有间隙。因此,一天从该日期的第一时刻开始,一直持续到但不包括下一个日期的第一时刻。搜索堆栈溢出以了解更多信息。这已经讲过很多次了。 @BasilBourque epochSecond is a method, not a field. - 上面的代码是用 kotlin 而不是 java 编写的。在 kotlin 中,getter/setter 是自动定义的,因此我们可以使用字段名称访问它(在内部它只是 getter 方法) @Nitish 谢谢你,我会更正答案。【参考方案2】:

ZoneId.systemDefault() 更改为 UTC 时区

 val timestamp = startOfDay.atZone(ZoneId.of("UTC")).toInstant().epochSecond

【讨论】:

谢谢@Nitish。通过使用 atStartOfDay() 获得今天的开始时间。但是你有什么想法:我怎样才能得到今天的结束时间? 是的,当然,我已经在这里编辑了我的答案 - start of date,因为它在那里而不是在这里感觉更合适,因为你的其他问题与这个查询更相关

以上是关于如何以 GMT 格式获取今天的时间戳 - Kotlin的主要内容,如果未能解决你的问题,请参考以下文章

如何在 java 中获取当前的 Linux GMT 时间戳?

如何以正确的格式获取 UTC 偏移量(时区)?

如何在 hive 中将时间戳转换为 gmt 格式

从unix时间戳获取GMT日期[重复]

IOS - 以 GMT 格式获取设备的当前时区

雪花 GMT 字符串到日期转换