奇怪的日期格式到Java日期

时间:2011-08-20 10:17:56

标签: java

我从API获得了以下日期格式(是的,我试图让他们更改API ... dailywtf故事):

\/Date(1310481956000+0200)\/

如何将其转换为Java日期? (java.util.Date)

这来自.NET JSON Web服务。

4 个答案:

答案 0 :(得分:9)

在不知道日期/时间字符串的含义的情况下,让我猜一下。

1310481956000看起来是纪元后的毫秒,而+0200是相对于GMT的偏移量。

以下代码似乎也表明了这一点:

final TimeZone tz = TimeZone.getTimeZone("GMT+0200");
final Calendar cal = Calendar.getInstance(tz);
cal.setTimeInMillis(1310481956000L);
final SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
f.setTimeZone(tz);
System.out.println(f.format(cal.getTime()));

打印2011-07-12 16:45:56 GMT+02:00

答案 1 :(得分:2)

  

如何将其转换为Java日期? (java.util.Date)

首先,让“他们”清楚准确地告诉您日期格式的含义。 (如果他们不能或不能猜到;见下文。)

接下来编写一个自定义解析器来解析String并提取信息内容。

最后,将信息内容转换为与Date构造函数之一匹配的表单,并创建实例。


我的猜测是1310481956000部分是自UNIX纪元(1970/01 / 01T00:00)以来的毫秒数,而0200表示时区偏移2小时(MET? )。但是,你不应该依赖猜测。获取“他们”为您提供规范,或至少一些示例以及它们对应的实际时间/时区。

答案 2 :(得分:1)

您必须从API提供商处获取格式,但它似乎是epoch +时区的偏移量。要转换它,你可以试试。

final String fromAPI = "1310481956000+0200"
final String epochTime = fromAPI.substring(0, fromAPI.indexOf("+"));
final String timeZoneOffSet = fromAPI.substring(fromAPI.indexOf("+"), fromAPI.size());

Date date = new Date(Long.parseLong(epochTime));

请注意,我没有对时区做任何事情(如果是这样的话)。你必须处理这个问题,但这应该让你走上正确的道路。

答案 3 :(得分:0)

TL;博士

Instant.ofEpochMilli( 
    java.lang.Long.parseLong( "1310481956000" )
).atOffset( ZoneOffset.of( "+0200" ) )

使用java.time

accepted Answer是正确但过时的。处理这个问题的现代方法是通过java.time类。

输入不明确。它是从UTC 1970-01-01T00:00:00:Z的1970年第一时间的Unix epoch reference日期时间开始计算,然后比UTC提前两小时调整一下吗?如果是这样,这里看到的示例代码可以正常工作。

首先将输入的数字解析为InstantInstant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位数字)。

提取字符串的第一部分并解析为long

long millisSinceEpoch = java.lang.Long.parseLong( "1310481956000" );
Instant instant = Instant.ofEpochMilli( millisSinceEpoch );
  

instant.toString():2011-07-12T14:45:56Z

提取字符串的最后一部分并解析为ZoneOffset

ZoneOffset offset = ZoneOffset.of( "+0200" );

将偏移量应用于Instant以获得OffsetDateTime

OffsetDateTime odt = instant.atOffset( offset );
  

odt.toString():2011-07-12T16:45:56 + 02:00

请注意,offset-from-UTC不是时区。区域是偏移量加上用于处理Daylight Saving Time (DST)等异常的一组规则。

尽可能避免使用java.util.Date。但是如果你必须使用一个,你可以转换为/从java.time。查看添加到旧类的新转换方法。

java.util.Date d = java.util.Date.from( odt.toInstant() );
  

d.toString():Tue Jul 12 14:45:56 GMT 2011

请参阅live code at IdeOne.com,了解整个示例。

关于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