我得到了下面的日期格式,我从一个API得到(是的,我试图让他们改变API ... dailywtf故事):奇怪的日期格式的Java日期
\/Date(1310481956000+0200)\/
我怎么能转换这成一个Java日期? (java.util.Date)
这来自.NET JSON Web服务。
我得到了下面的日期格式,我从一个API得到(是的,我试图让他们改变API ... dailywtf故事):奇怪的日期格式的Java日期
\/Date(1310481956000+0200)\/
我怎么能转换这成一个Java日期? (java.util.Date)
这来自.NET JSON Web服务。
不知道日期/时间字符串代表什么,让我猜测。
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
我已将日期转换为字符串'“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
@vissu pepala Java中的日期在内部只是整数,默认的日期输出格式完全依赖于系统/语言环境。如果您想以特定格式输出日期,请使用上面的SimpleDateFormat指定格式。 –
如何将其转换为Java日期? (java.util.Date)
首先,获取“他们”以清楚准确地告诉您日期格式的含义。 (如果他们不会或不能猜到,请参阅下面的内容)
接下来编写一个自定义分析器来解析字符串并提取信息内容。
最后,将信息内容转换为与Date
构造函数中的一个匹配的表单并创建一个实例。
我的猜测是,1310481956000
部分是由于UNIX纪元(1970/01/01T00:00)的毫秒数(?MET),并且所述0200
表示时区2小时抵消。但是,你不应该依赖猜测。获取“他们”给你的规范,或至少一些例子和他们对应的实际时间/时区。
你必须了解从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));
请注意,我没有做任何事情与时区(如果那是它是什么)。你必须处理,但这应该让你走上正确的道路。
Instant.ofEpochMilli(
java.lang.Long.parseLong("1310481956000")
).atOffset(ZoneOffset.of("+0200"))
的accepted Answer是正确的,但已经过时。处理这个问题的现代方法是通过java.time类。
输入不明确。是从1970年第一个时间点的UTC 1970-01-01T00:00:00:Z
的第一个日期时间的Unixepoch reference算起,然后在UTC之前两个小时进行调整?如果是这样,这里看到的这个示例代码有效。
首先将输入号码解析为Instant
。 Instant
类表示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 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
,YearQuarter
和more。
该格式首先代表什么?它是如何工作的?它是时间戳吗? –
我认为这种格式在某些.NET服务中用于JSON。 – Jonas