我正在使用以这种格式返回我的第三部分服务:
"EndDate":"/Date(1487615921387-0300)/","StartDate":"/Date(1487608721387-0300)/"
我的问题是将此日期转换为LocalDate
或LocalDateTime
。我在这里找到了一些答案,但是他们正在使用Joda时间,所以没有帮助。
您需要学习输入数据的含义。
最后一部分-0300
可能是从UTC提前或后面几个小时的偏移量。我建议将其与结肠(-03:00
)一起使用,但没有可接受。您需要知道Plus/Minus符号是否在UTC前方或后面。现代协议倾向于在UTC之前使用A plus ,而A minus for背后有相反的协议。
知道偏移是不是时区。时区是特定区域的偏移历史,该区域具有诸如夏令时(DST)等异常情况的规则。
第一部分可能是自时代参考日期以来的毫秒数。我们可以猜测您的时代是UTC(1970-01-01T00:00:00
)中常用的1970年第一刻。但是,各种已知软件系统使用至少几个时代。同样,您必须咨询数据的来源。
与我之前见过的偏移量的count-eapoch的这种特殊组合。它使我感到困惑,因为仅在没有偏移的情况下简单地使用UTC中的count-eprom-epoch,这更有意义。如果要显示已调整到时区的日期时间,请使用标准ISO 8601字符串格式。
我会猜测您的输入号是UTC中毫秒的时期计数。因此,我们将其解析为Instant
对象。Instant
类代表UTC的时间表上的一刻,其分辨率为纳秒(小数分数的最多九(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
与 OffsetDateTime
的另一个偏移中的墙上时间相同的时刻。
OffsetDateTime odt = instant.atOffset ( offset );
请参阅此代码在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.Time框架内置在Java 8及更高版本中。这些类取代了麻烦的旧旧日期时间类,例如java.util.Date
,Calendar
,&SimpleDateFormat
。
现在处于维护模式的Joda Time项目建议迁移到Java.Time类。
要了解更多信息,请参阅Oracle教程。并搜索堆栈溢出以获取许多示例和解释。规格是JSR 310。
从哪里获得Java.Time课程?
- Java SE 8 和 SE 9 和更高版本
- 内置。
- 标准Java API的一部分,具有捆绑的实现。
- Java 9添加了一些次要功能和修复。
- Java SE 6 和 SE 7
- 大部分Java.Time功能都回到Java 6&7在 Threeten-Backport 。
- Android
- threetenabp project aptapts threeten-backport (上面提到)Android专门。
- 参见如何使用Threetenabp…。
Threeten-Extra项目扩展了Java.Time,并提供了其他类。该项目是可能将来在Java.Time中增加的遗嘱。您可能在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
等。
好的,首先您应该从字符串中提取日期,我使用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));
}
}