在 Java/Scala 中,如何以最少的代码/以最优雅的方式在几秒钟内获得特定的 UTC 日期?

Posted

技术标签:

【中文标题】在 Java/Scala 中,如何以最少的代码/以最优雅的方式在几秒钟内获得特定的 UTC 日期?【英文标题】:In Java/Scala how to get specific UTC date in seconds with minimal amount of code/ in most elegant way? 【发布时间】:2015-09-15 20:25:56 【问题描述】:

更具体地说,我需要:

// seconds from Jan 1 2010
val currentAerospikeTime = (new Date().getTime - new Date(110, 0, 1).getTime)/1000;

但它使用了已弃用的 Date 构造函数,所以我收到了警告。但是在 Scala 中,没有办法关闭单行的警告(我不想完全关闭它)。那么我该如何重写它,使其更简洁并让它在没有警告的情况下编译呢?

也许我遗漏了一些东西,但我找不到捷径,无论是使用 Java 8 API 还是使用 Joda 库(没有彻底研究它,但我不想添加仅适用于这一行的库)。

【问题讨论】:

【参考方案1】:

如何使用ChronoUnit#between 来解决这个问题,例如:

ChronoUnit.SECONDS.between(
    LocalDate.of(2010, 1, 1).atStartOfDay(ZoneId.of("Z")), 
    ZonedDateTime.now());

或者,非常简洁:

(System.currentTimeMillis() - 1262304000000L) / 1000;

【讨论】:

第二个显然是赢家。为我自己没有来到这里感到羞耻。使用 .Net 太懒了 :-)【参考方案2】:

在 Java 8 和 JodaTime 中有一个 Duration 的概念。

自 2010 年 1 月 1 日以来的秒数可以通过(java 8 示例)确定

LocalDateTime jan2010 = LocalDate.of(2010,1,1).atStartOfDay(); // can also pass a ZoneId here
Long secondsSince2010 = Duration.of(jan2010, LocalDateTime.now()).getSeconds();

对于 JodaTime,解决方案类似,只是对象和方法的构造略有不同。

【讨论】:

这实际上比我的还要好,因为它没有使用带有编码时区'Z'parse 方法,并且使用atStartOfDay 更加明确。【参考方案3】:

我建议为此使用新的时间 API(基于 Joda Time):

long diffInSeconds = Duration.between(Instant.parse("2010-01-01T00:00:00Z"), Instant.now()).getSeconds();

我不喜欢 Calendar 解决方案的地方:

从哪里获取Calendar 实例?您必须确保其中包含的时间(小时、分钟、...)也是您想要的时间。 这是旧的 API,新的总是更闪亮 ;)

别开玩笑了,新的 API 确实更精确。 我不会在那里使用getSeconds() 方法,而是坚持使用Duration 对象。我刚刚包含它是为了证明您可以获得完全相同的东西(但恕我直言,Duration 是一个更清晰的类型......持续时间......比long)。

【讨论】:

【参考方案4】:

不使用 Date 类中的构造函数,试试 Calendar 怎么样?

Calendar.set(year + 1900, month, date);

这是您查找的已弃用构造函数的 javadoc 中推荐的内容。

【讨论】:

我在发布问题之前尝试用 Calendar 编写表达式,但实际上它是几行代码而不是一行代码。没那么简洁。不过还是感谢您的意见。

以上是关于在 Java/Scala 中,如何以最少的代码/以最优雅的方式在几秒钟内获得特定的 UTC 日期?的主要内容,如果未能解决你的问题,请参考以下文章

从 Scala Spark 代码调用 Pyspark 脚本

如何在bigquery中以最少的数据库命中执行多个sql

如何以最少的内存使用裁剪位图?

如何训练isolationForest模型以给出最少的误报数?

如何以最少的内存使用对大量数据进行聚类

如何以最少的数据库点击次数将多个实例添加到 Django 反向外键集?