2011-08-20 136 views
2

我得到了下面的日期格式,我从一个API得到(是的,我试图让他们改变API ... dailywtf故事):奇怪的日期格式的Java日期

\/Date(1310481956000+0200)\/ 

我怎么能转换这成一个Java日期? (java.util.Date)

这来自.NET JSON Web服务。

+2

该格式首先代表什么?它是如何工作的?它是时间戳吗? –

+0

我认为这种格式在某些.NET服务中用于JSON。 – Jonas

回答

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

+0

我已将日期转换为字符串'“MM/dd/yyyy”'格式。我想将转换后的日期解析为Java.util.Date格式的“MM/dd/yyyy”格式。但输出格式更改为“2011-07-12 16:45:56 GMT + 02:00”格式。我想保持目前的格式(“MM/dd/yyyy”)。但需要Java.util.Date **不是STRING **。任何帮助请... – vissu

+0

@vissu pepala Java中的日期在内部只是整数,默认的日期输出格式完全依赖于系统/语言环境。如果您想以特定格式输出日期,请使用上面的SimpleDateFormat指定格式。 –

2

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

首先,获取“他们”以清楚准确地告诉您日期格式的含义。 (如果他们不会或不能猜到,请参阅下面的内容)

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

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


我的猜测是,1310481956000部分是由于UNIX纪元(1970/01/01T00:00)的毫秒数(?MET),并且所述0200表示时区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)); 

请注意,我没有做任何事情与时区(如果那是它是什么)。你必须处理,但这应该让你走上正确的道路。

0

TL;博士

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

使用java.time

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

输入不明确。是从1970年第一个时间点的UTC 1970-01-01T00:00:00:Z的第一个日期时间的Unixepoch 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():星期二07月12 14点45分56秒GMT 2011

参见live code at IdeOne.com覆盖该整个例子。


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore