在 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 日期?的主要内容,如果未能解决你的问题,请参考以下文章