sim*_*eer 2 java timestamp epoch long-integer
我可以使用 java long 以合理的精度存储以微秒为单位的纪元时间,而不需要任何特殊的有符号到无符号转换技巧吗?如果是这样,我将如何计算结束日期范围?
这是通常的 8 字节日期范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
更新
从使用建议:
new Date(Long.MAX_VALUE)
Run Code Online (Sandbox Code Playgroud)
这是嗯的结束日期:
new Date(Long.MAX_VALUE/1_000)
Sat Jan 09 20:00:54 PST 294247
Run Code Online (Sandbox Code Playgroud)
这是使用纳秒正长值的结束日期:
new Date(Long.MAX_VALUE/1_000_000)
Fri Apr 11 16:47:16 PDT 2262
Run Code Online (Sandbox Code Playgroud)
Bas*_*que 10
您必须选择一个纪元参考日期。虽然业界使用了数十种不同的纪元,但其中一个更常见的是Unix 时间:UTC 中的 1970 年的第一个时刻,1970-01-01T00:00:00Z。该点之后的时刻使用正数计数,之前的时刻使用负数计数。
当然,一年的长度因闰年而异,但我们可以很容易地近似。使用该类及其方便的转换方法获取一年中的纳秒数TimeUnit。
压缩一些数字。
long nanosPerDay = TimeUnit.DAYS.toNanos( 1L );
long nanosPerYear = ( long ) ( nanosPerDay * 365.25 );
long maximumYears = ( Long.MAX_VALUE / nanosPerYear );
Run Code Online (Sandbox Code Playgroud)
转储到控制台。
System.out.println( "nanosPerDay: " + nanosPerDay );
System.out.println( "nanosPerYear: " + nanosPerYear );
System.out.println( "Long.MAX_VALUE: " + Long.MAX_VALUE + " provides for maximumYears: " + maximumYears );
Run Code Online (Sandbox Code Playgroud)
nanosPerDay:86400000000000
nanosPerYear:31557600000000000
Long.MAX_VALUE: 9223372036854775807 规定maximumYears: 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.
Run Code Online (Sandbox Code Playgroud)
这允许最小/最大:
Instant.MIN = -1000000000-01-01T00:00ZInstant.MAX = 1000000000-12-31T23:59:59.999999999Z请注意,java.time类确实携带纳秒的分辨率,而他们取代传统类(Date,Calendar,等)解析为毫秒。
有关详细信息,请参阅JavaDoc 类和 OpenJDK源代码(在Mercurial 中)。
提示:java.time类最适合面向业务的目的。如果您从事科学、工程、考古或历史工作,请使用适合该领域的其他符号,可能是String类型。
请注意,不同的计算机系统在计时方面使用不同的粒度。
如上所述,java.time类解析为纳秒,表示十进制小数秒的九位数字。遗留类使用毫秒,表示十进制小数秒的三位数字。其他系统,例如Postgres数据库,使用微秒作为十进制小数秒的六位数字。在跨系统交换或比较数据时,您可能希望使用truncatedTo各种java.time类上的方法。
当前传统的计算机硬件时钟只能精确到微秒或更粗。他们可能会报告纳秒,但并不准确到那个程度。因此,您会发现Instant.now()Java 9、10 和 11中的方法将当前时刻捕获到微秒(虽然数据类型可以处理nanos,但它以微秒为单位检测当前时间)。
Instant.now().toString(): 2019-01-23T12:34:56.123456Z
该java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat。
要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
您可以直接与您的数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 & JPA 2.2 支持java.time。java.sql.*
从哪里获得 java.time 类?
| 归档时间: |
|
| 查看次数: |
3899 次 |
| 最近记录: |