Java - 将.NET日期转换为LocalDateTime

时间:2017-02-20 17:55:05

标签: java date date-conversion

我正在使用以这种格式返回日期的第三方服务:

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

我的问题是将此日期转换为LocalDateLocalDateTime。我在这里找到了一些答案,但他们使用的是joda时间,所以没有帮助。

2 个答案:

答案 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 );

应用ZoneIdwall-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

请注意instantodt之间的三小时差异,小时1815之间的差异,即偏移的影响。仍然是相同的同时时刻,时间轴上的相同点,但是看到了不同的挂钟时间。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 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));
    }
}