![](/img/trans.png)
[英]What is the correct way to create threads in an enterprise java application
[英]What is the correct way to create a timestamp in Java?
给定年,月,日,小时,分钟和秒,创建Java UTC(GMT)时间戳的正确方法是什么?
我考虑过的选项,但仍有待于:
java.util.Date date = new java.util.Date(year - 1900, month, dayOfMonth, hour, minute, second);
long timestamp = date.getTime();
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
c.set(Calendar.HOUR_OF_DAY, hour);
c.set(Calendar.MINUTE, minute);
c.set(Calendar.SECOND, second);
c.set(Calendar.MILLISECOND, 0);
long timestamp = c.getTimeInMillis();
我与此有关的问题之一是,我很难在不混淆更多TimeZone问题的情况下进行测试。
是否有使用标准API的明确正确方法?
更新:希望使用标准JavaSE对此进行解答。 我知道Joda-Time很棒,但是在这种情况下这不是一个选择。
没有,没有(除非你可以使用乔达时间 ),正确的方法是使用日历和日历API 是丑陋的,任何人都无法在此刻做的。
用于日期的标准Java API十分不便。 考虑使用Joda-Time :
long timestamp = new LocalDateTime(year, month, day, hour, minute, second)
.getLocalMillis();
我认为这会很好
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
Date date = sdf.parse("2011-12-21 12:00:00+0000");
您必须自己构建日期字符串,但是它很短并且应该可以正常工作。 并根据自己的喜好创建SimpleDateFormat,重要的部分是与“ +0000”相对应的Z。
这是同一行的另一种替代方法
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = sdf.parse("2011-12-21 12:00:00");
它具有明确的时区,并且Z被删除。
OffsetDateTime.of( 2018 , 1 , 23 , 12 , 34 , 56 , 0, ZoneOffset.UTC )
现代方法使用java.time类。
与麻烦的旧式日期时间类不同, java.time类使用合理的编号:
2018
表示2018
年。(1900年没有疯狂的数学。) Instant
类以UTC表示时间轴上的时刻,分辨率为纳秒 (最多十进制的九(9)位数字)。
如果愿意,可以解析字符串。
Instant instant = Instant.parse( "2018-01-23T12:34:56Z" ) ;
尽管Instant
是java.time的基本构建块类,但OffsetDateTime
类更加灵活。 为了方便起见,UTC本身的UTC偏移量定义为常数 。
OffsetDateTime odt = OffsetDateTime.of( 2018 , 1 , 23 , 12 , 34 , 56 , 0, ZoneOffset.UTC ) ;
就个人而言,我更喜欢使用碎片。
您可以指定Month
枚举对象来代替月份的整数。
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ; // Date-only, without time-of-day.
LocalTime lt = LocalTime.of( 12 , 34 , 56 ) ; // Time-of-day, without date.
ZoneOffset offset = ZoneOffset.UTC ;
OffsetDateTime odt = OffsetDateTime.of( ld , lt , offset ) ;
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程 。 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310 。
使用兼容JDBC 4.2或更高版本的JDBC驱动程序 ,您可以直接与数据库交换java.time对象。 不需要字符串或java.sql。*类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.