繁体   English   中英

用Java创建时间戳的正确方法是什么?

[英]What is the correct way to create a timestamp in Java?

给定年,月,日,小时,分钟和秒,创建Java UTC(GMT)时间戳的正确方法是什么?

我考虑过的选项,但仍有待于:

1-使用不推荐使用的Date构造函数

java.util.Date date = new java.util.Date(year - 1900, month, dayOfMonth, hour, minute, second);
long timestamp = date.getTime();

2-使用TimeZone设置为GMT的日历

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被删除。

TL;博士

OffsetDateTime.of( 2018 , 1 , 23 , 12 , 34 , 56 , 0, ZoneOffset.UTC )

java.time

现代方法使用java.time类。

与麻烦的旧式日期时间类不同, java.time类使用合理的编号:

  • 2018表示2018年。(1900年没有疯狂的数学。)
  • 1月至12月为1-12点。 (不傻0-11。)
  • 根据星期的ISO 8601标准定义,周一至周日为1-7。 (根据地区而定。)

Instant类以UTC表示时间轴上的时刻,分辨率为纳秒 (最多十进制的九(9)位数字)。

如果愿意,可以解析字符串。

Instant instant = Instant.parse( "2018-01-23T12:34:56Z" ) ;

尽管Instantjava.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.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.DateCalendarSimpleDateFormat

现在处于维护模式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中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM