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

在Java/Scala中,如何以最优雅的方式以最少的代码/秒数获得特定的UTC日期?,java,scala,utc,epoch,aerospike,Java,Scala,Utc,Epoch,Aerospike,更具体地说,我需要: // seconds from Jan 1 2010 val currentAerospikeTime = (new Date().getTime - new Date(110, 0, 1).getTime)/1000; 但是它使用了弃用的Date构造函数,所以我得到了一个警告。但是在Scala中,无法关闭一行的警告(我不想完全关闭它)。那么我如何重写它,使它更简洁,让它在没有警告的情况下编译呢 也许我遗漏了一些东西,但我找不到一个简单的方法来实现它,无论是Java 8

更具体地说,我需要:

// seconds from Jan 1 2010
val currentAerospikeTime = (new Date().getTime - new Date(110, 0, 1).getTime)/1000;
但是它使用了弃用的
Date
构造函数,所以我得到了一个警告。但是在Scala中,无法关闭一行的警告(我不想完全关闭它)。那么我如何重写它,使它更简洁,让它在没有警告的情况下编译呢


也许我遗漏了一些东西,但我找不到一个简单的方法来实现它,无论是Java 8 API还是Joda库(没有彻底研究它,但我也不想只为这一行添加库)。

与其在类日期中使用构造函数,不如尝试日历

Calendar.set(year + 1900, month, date);
这是您所寻找的不推荐使用的构造函数的javadoc中推荐的方法。

使用如何解决此问题,例如:

ChronoUnit.SECONDS.between(
    LocalDate.of(2010, 1, 1).atStartOfDay(ZoneId.of("Z")), 
    ZonedDateTime.now());
或者,非常简洁:

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

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

long diffInSeconds = Duration.between(Instant.parse("2010-01-01T00:00:00Z"), Instant.now()).getSeconds();
我不喜欢
日历
解决方案的地方:

  • 从何处获取要获取的
    日历
    实例?你必须确保其中包含的时间(小时、分钟等)也是你想要的时间
  • 这是旧的API,新的API总是更闪亮;)
撇开玩笑不谈,新的API确实更精确。
我不会在那里使用
getSeconds()
方法,而是坚持使用
Duration
对象。我刚刚加入它是为了证明你可以得到完全相同的东西(但是对于持续时间来说,imho
Duration
long
更清晰)

自2010年1月1日起的秒数可由以下公式确定(java 8示例)


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

这实际上比我的更好,因为它没有将
parse
方法与编码时区
'Z'
一起使用,并且在
atStartOfDay
中更加明确。在发布问题之前,我尝试用Calendar编写表达式,但它是错误的几行代码实际上是一行代码。不那么简洁。不过还是要谢谢你的意见。第二个显然是赢家。真为我感到羞耻,我自己没有想到这一点。使用.Net时太懒:-)
LocalDateTime jan2010 = LocalDate.of(2010,1,1).atStartOfDay(); // can also pass a ZoneId here
Long secondsSince2010 = Duration.of(jan2010, LocalDateTime.now()).getSeconds();