我正在使用以这种格式返回日期的第三方服务:
"EndDate":"\/Date(1487615921387-0300)\/","StartDate":"\/Date(1487608721387-0300)\/"
我的问题是将此日期转换为LocalDate
或LocalDateTime
。我在这里找到了一些答案,但他们使用的是joda时间,所以没有帮助。
答案 0 :(得分:2)
您需要了解输入数据的含义。
最后一部分-0300
可能是offset-from-UTC,比UTC提前或落后数小时。我建议使用冒号(-03:00
)的格式,但不能接受。您需要知道加号/减号是否意味着UTC之前或之后。现代协议倾向于在UTC之前使用加上,在后面使用减去,但是有些协议会相反。
知道偏移不时区。 time zone是特定区域的偏移历史记录,其中包含Daylight Saving Time (DST)等异常规则。
第一部分可能是epoch reference date以来的毫秒数。我们可以猜测您的纪元是UTC中常用的1970年第一时刻(1970-01-01T00:00:00
)。但是,各种已知的软件系统至少使用a couple dozen epochs。同样,您必须查阅数据来源。
这是我从前见过的一个从纪元开始计数的特殊组合。这使我感到困惑,因为在没有偏移的情况下简单地使用UTC中的count-from-epoch更有意义。如果要显示调整为时区的日期时间,请使用标准ISO 8601字符串格式。
我猜你的输入数字是UTC中的纪元数,以毫秒为单位。所以我们将其解析为Instant
对象。 Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。
String input = "1487615921387-0300";
String inputCount = input.substring ( 0 , 13 ); // zero-based index counting.
long count = Long.parseLong ( inputCount );
Instant instant = Instant.ofEpochMilli ( count );
我们可以将偏移量解析为ZoneOffset
对象。
String inputOffset = input.substring ( 13 );
ZoneOffset offset = ZoneOffset.of ( inputOffset );
应用ZoneId
与wall-clock time中另一个偏移中的OffsetDateTime
相同的时刻。
OffsetDateTime odt = instant.atOffset ( offset );
请参阅此code run live at IdeOne.com。
输入:1487615921387-0300
inputMillis:1487615921387
inputOffset:-0300
数:1487615921387
instant.toString():2017-02-20T18:38:41.387Z
odt.toString():2017-02-20T15:38:41.387-03:00
请注意instant
和odt
之间的三小时差异,小时18
与15
之间的差异,即偏移的影响。仍然是相同的同时时刻,时间轴上的相同点,但是看到了不同的挂钟时间。
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。
答案 1 :(得分:0)
好的,首先你应该从你的字符串中提取日期我使用patttern这个想法很简单
public static void main(String[] args) {
String str = "\"EndDate\":\"\\/Date(1487615921387-0300)\\/\",\"StartDate\":\"\\/Date(1487608721387-0300)\\/\"";
//Get Long from your String between Date( and )
String start = "Date(", end = ")";
String regexString = Pattern.quote(start) + "(.*?)" + Pattern.quote(end);
Pattern pattern = Pattern.compile(regexString);
Matcher matcher = pattern.matcher(str);
List<String> res = new ArrayList<>();
while (matcher.find()) {
//now we get results like this 1487608721387-0300
res.add(matcher.group(1));
}
//You can change the format like you want
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date;
String[] split;
for (String s : res) {
split = s.split("-");
///we should to split the String to get the first part 1487608721387
//then we get Date from this String
date = new Date(new Long(split[0]));
//Set time zone to your format i'm not sure if it is correct you can avoid it
//format.setTimeZone(TimeZone.getTimeZone(split[1]));
//Show your date
System.out.println(format.format(date));
}
}