Java-将.NET日期转换为LocalDateTime



我正在使用以这种格式返回我的第三部分服务:

"EndDate":"/Date(1487615921387-0300)/","StartDate":"/Date(1487608721387-0300)/"

我的问题是将此日期转换为LocalDateLocalDateTime。我在这里找到了一些答案,但是他们正在使用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 );

应用该 ZoneIdOffsetDateTime的另一个偏移中的墙上时间相同的时刻。

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

请注意instantodt之间的三个小时差异,18小时与15,偏移效果。仍然是同时发生,时间表上相同的点,但有不同的墙壁锁定时间。


关于java.time

Java.Time框架内置在Java 8及更高版本中。这些类取代了麻烦的旧旧日期时间类,例如java.util.DateCalendar,&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中增加的遗嘱。您可能在这里找到一些有用的类,例如IntervalYearWeekYearQuarter等。

好的,首先您应该从字符串中提取日期,我使用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));
    }
}

最新更新