我从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日
如何正确转换?
答案 0 :(得分:2)
OffsetDateTime.of(
LocalDate.parse( "2018-12-31" ) ,
LocalTime.MIN ,
ZoneOffset.UTC
)
.toInstant()
.toEpochMilli()
1546214400000
您使用麻烦的旧日期时间类很久以前因Java 8及更高版本中内置的java.time类的到来而遗留下来。
您的输入字符串恰好符合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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。