将日期转换为long的问题

时间:2018-01-02 20:39:47

标签: java java-date

我从Excel工作表中提取数据,使用Java加载到Hubspot。 以下是数据的外观:

此日期 2018-12-31 成为 2017年12月31日,一旦它在Hubspot旁边。 这是错的!

这是我的代码:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                df.setTimeZone(TimeZone.getTimeZone("UTC"));
                Date dt = null;
                try {
                    dt = df.parse(member.getUsageEndDate());
                } catch (java.text.ParseException e3) {
                    //dt = null;
                    e3.printStackTrace();
                }                                      
                Long l = dt.getTime(); 

如果我在记事本中打开数据,它看起来像这样: 2018年5月31日

如何正确转换?

1 个答案:

答案 0 :(得分:2)

TL;博士

OffsetDateTime.of( 
    LocalDate.parse( "2018-12-31" ) , 
    LocalTime.MIN , 
    ZoneOffset.UTC 
)
.toInstant()
.toEpochMilli()
  

1546214400000

详细

避免遗留日期时间类

您使用麻烦的旧日期时间类很久以前因Java 8及更高版本中内置的java.time类的到来而遗留下来。

ISO 8601

您的输入字符串恰好符合ISO 8601标准格式。解析/生成字符串时,默认情况下在java.time中使用这些格式。因此无需指定格式化模式。

LocalDate ld = LocalDate.parse( "2018-12-31" ) ;

一天的第一时刻

显然,您需要UTC当天的第一时刻。将OffsetDateTime与常量ZoneOffset.UTC一起使用。

OffsetDateTime odt = OffsetDateTime.of( ld , LocalTime.MIN , ZoneOffset.UTC ) ;

转储到控制台。

System.out.println( "odt.toString(): " + odt );

请参阅此code run live at IdeOne.com

  

odt.toString():2018-12-31T00:00Z

计数-从历元

您似乎想要自UTC,1970-01-01T00:00Z的1970年第一时刻的纪元参考日期以来的毫秒数。解压缩Instant对象,java.time中的基本构造块类,并调用其方便的Instant::toEpochMilli方法。

long millisecondsSinceEpoch = odt.toInstant().toEpochMilli() ;

请参阅此code run live at IdeOne.com

  

1546214400000

走向另一个方向。

Instant instant = Instant.ofEpochMilli( 1_546_214_400_000L ) ;

关于java.time

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

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore