将日期转换为long的问题

问题描述 投票:0回答:1

我从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日

我怎样才能正确转换?

java java-date
1个回答
2
投票

tl;dr

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

1546214400000

Details

避免遗留日期时间类

您使用麻烦的旧日期时间类很久以前因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

计数从历元

您似乎想要自1970年第一时刻的纪元参考日期以来在UTC,1970-01-01T00:00Z中的毫秒计数。提取一个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 ) ;

About java.time

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

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

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如IntervalYearWeekYearQuartermore

© www.soinside.com 2019 - 2024. All rights reserved.