gpt4 book ai didi

java - Java是否足够长以以毫秒为单位存储纪元时间?

转载 作者:行者123 更新时间:2023-11-29 08:24:26 25 4
gpt4 key购买 nike

我可以使用java long来以合理的精度存储纪元时间(以微秒为单位),而没有任何特殊的有符号到无符号转换技巧吗?如果是这样,我将如何计算结束日期范围?

这是通常的8个字节的日期范围:
-9,223,372,036,854,775,808至9,223,372,036,854,775,807

更新

从建议使用:

new Date(Long.MAX_VALUE)


这是um的结束日期:

new Date(Long.MAX_VALUE/1_000)

Sat Jan 09 20:00:54 PST 294247


这是结束日期,使用正长值表示纳秒:

new Date(Long.MAX_VALUE/1_000_000)

Fri Apr 11 16:47:16 PDT 2262

最佳答案

tl; dr


纳米仅给出了三个世纪。
切勿浪费时间。 ☛使用java.time
交换日期时间值时,切勿使用从纪元开始计数,而应使用标准ISO 8601格式的文本。


做数学

您必须选择一个epoch reference date。虽然dozens of various epochs在行业中使用,但更常见的一种通常称为Unix Time:UTC 1970年的第一时刻,1970-01-01T00:00:00Z。使用正数计数来跟踪该点之后的时刻,而之前的力矩则使用负数进行跟踪。

当然,一年的长度因by年而异,但我们可以很容易地近似得出。使用TimeUnit类及其方便的转换方法来获取一年中的nanoseconds数。

处理一些数字。

long nanosPerDay = TimeUnit.DAYS.toNanos( 1L );
long nanosPerYear = ( long ) ( nanosPerDay * 365.25 );
long maximumYears = ( Long.MAX_VALUE / nanosPerYear );


转储到控制台。

System.out.println( "nanosPerDay: " + nanosPerDay );
System.out.println( "nanosPerYear: " + nanosPerYear );
System.out.println( "Long.MAX_VALUE: " + Long.MAX_VALUE + " provides for maximumYears: " + maximumYears );


参见此 code run live at IdeOne.com


  每天:86400000000000
  
  每年:31557600000000000
  
  Long.MAX_VALUE:9223372036854775807规定了最长年份:292


因此,在1970年之前和之后,我们得到的收益不到±3个世纪。因此,只要几个世纪对您的应用程序来说足够好,这种方法就行得通。日历用完后,至少您不会来修复它。 ;-)

Instant

幸运的是,我们不需要自己做这个数学运算。

现代Java附带了可用于面向业务的应用程序的最先进的日期时间处理框架: JSR 310中定义的java.time类。

java.time.Instant类使用不同的策略来跟踪时间。该类将保留1970年UTC时代前后的整个秒数,并为瞬间的小数秒分别记录纳秒。

认为是:

moment = ( whole-seconds + fractional-second ) ; // Since 1970-01-01T00:00:00Z.


这样可以实现以下最大值/最小值:


Instant.MIN = -1000000000-01-01T00:00Z
Instant.MAX = 1000000000-12-31T23:59:59.999999999Z


请注意,java.time类确实具有纳秒级的分辨率,而它们所取代的旧类( DateCalendar等)解析为 milliseconds

有关详细信息,请参见 class JavaDoc和OpenJDK source code(在 Mercurial中)。

提示:java.time类最适合面向业务的目的。如果您正在从事科学,工程,考古或历史工作,请使用其他适合该领域的符号,可能是 String类型。

粒度

请注意,不同的计算机系统在计时方面使用不同的粒度。

如上所述,java.time类解析为十亿分之一秒的九位数的纳秒。传统类使用毫秒,即十进制小数点后三位数字。其他系统(例如 Postgres数据库)将 microseconds用作十进制小数点后六位数字。在跨系统交换或比较数据时,您可能需要在各种java.time类上使用 truncatedTo方法。

当前的常规计算机硬件时钟仅精确到微秒或更粗。它们可能以纳秒为单位报告,但达不到该程度的准确度。因此,您会发现Java 9、10和11中的 Instant.now()方法将当前时刻捕获到微秒(虽然数据类型可以处理纳秒,但它以微秒为单位检测当前时间)。


  Instant.now()。toString():2019-01-23T12:34:56.123456Z




关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧 legacy日期时间类,例如 java.util.DateCalendarSimpleDateFormat

现在位于 Joda-Time中的 maintenance mode项目建议迁移到 java.time类。

要了解更多信息,请参见 Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为 JSR 310

您可以直接与数据库交换java.time对象。使用与 JDBC driver或更高版本兼容的 JDBC 4.2。不需要字符串,不需要 java.sql.*类。

在哪里获取java.time类?


Java SE 8Java SE 9Java SE 10Java SE 11和更高版本-具有捆绑实现的标准Java API的一部分。


Java 9添加了一些次要功能和修复。

Java SE 6Java SE 7


大多数java.time功能都被反向移植到 ThreeTen-Backport中的Java 6和7。

Android


更高版本的Android捆绑了java.time类的实现。
对于早期的Android(<26), ThreeTenABP项目改编为 ThreeTen-Backport(如上所述)。请参见 How to use ThreeTenABP…



ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如 IntervalYearWeekYearQuartermore

关于java - Java是否足够长以以毫秒为单位存储纪元时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54471157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com