Java-将.NET日期转换为LocalDateTime

Java-将.NET日期转换为LocalDateTime,java,date,date-conversion,Java,Date,Date Conversion,我正在使用第三方服务,以这种格式向我返回日期: "EndDate":"\/Date(1487615921387-0300)\/","StartDate":"\/Date(1487608721387-0300)\/" 我的问题是将此日期转换为LocalDate或LocalDateTime。我在这里找到了一些答案,但它们使用的是joda time,所以没有帮助。好的,首先你应该从字符串中提取日期,我使用一个模式。这个想法很简单 public static void main(String[] ar

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

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

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

好的,首先你应该从字符串中提取日期,我使用一个模式。这个想法很简单

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));
    }
}
publicstaticvoidmain(字符串[]args){
String str=“\'EndDate\”:\“\\/Date(1487615921387-0300)\\/\”,“StartDate\”:\“\\/Date(1487608721387-0300)\\/\”;
//从日期(和)之间的字符串中获取长字符串
字符串start=“Date(”,end=“)”;
String regexString=Pattern.quote(开始)+“(.*)”+Pattern.quote(结束);
Pattern=Pattern.compile(regexString);
Matcher-Matcher=pattern.Matcher(str);
List res=new ArrayList();
while(matcher.find()){
//现在我们得到这样的结果1487608721387-0300
res.add(匹配器组(1));
}
//您可以根据需要更改格式
SimpleDateFormat=新的SimpleDateFormat(“yyyy-MM-dd HH:MM:ss”);
日期;
字符串[]拆分;
for(字符串s:res){
拆分=s.拆分(“-”);
///我们应该拆分字符串以获得第一部分1487608721387
//然后我们从这个字符串中得到日期
日期=新日期(新长(拆分[0]);
//将时区设置为您的格式我不确定它是否正确您可以避免它
//format.setTimeZone(TimeZone.getTimeZone(split[1]));
//展示你的约会对象
System.out.println(format.format(date));
}
}

您需要了解输入数据的含义

最后一部分
-0300
可能是一个,提前或延迟几个小时。我建议使用带冒号(
-03:00
)但不带冒号的格式是可以接受的。您需要知道加号/减号表示UTC之前还是之后。现代协议倾向于在UTC之前使用加号,在UTC之后使用减号,但有些协议的作用正好相反

知道偏移量不是时区。A是具有异常规则的特定区域偏移历史,例如

第一部分很可能是自事件发生以来的毫秒计数。我们可以猜测您的纪元是UTC中常用的1970年第一个时刻(
1970-01-01T00:00:00
)。但是,至少有各种已知的软件系统使用。同样,您必须查阅数据源

这是我以前见过的历元计数和偏移量的特殊组合。这让我感到困惑,因为简单地使用UTC中的历元计数而不使用偏移量更有意义。如果要显示调整为时区的日期时间,请使用标准字符串格式

我猜您输入的数字是UTC中以毫秒为单位的历元计数。因此,我们将其解析为
即时
对象。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

我们可以将偏移量解析为一个对象

应用该值可将另一偏移中的力矩视为

看这个

输入:1487615921387-0300

输入毫秒:1487615921387

输入偏移量:-0300

计数:1487615921387

instant.toString():2017-02-20T18:38:41.387Z

odt.toString():2017-02-20T15:38:41.387-03:00

请注意
即时
odt
之间的三小时差异,小时数
18
15
之间的差异,以及偏移的影响。仍然是相同的同步时刻,时间线上的相同点,但使用不同的挂钟时间


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。你可以在这里找到一些有用的类,比如、、和。

你的日期应该是什么样子的我想你可以使用正则表达式来获取日期它可以是LocalDateTime。所以你的日期应该从这个
日期(1487608721387-0300)
所以在你的字符串中有两个日期我错了?对..在我的示例中,有两个日期。但是你是对的。
0300
是什么意思?非常感谢@YCF_L.。它工作得很好…只需要看看我是否需要调整这里的时区。。非常感谢。你的假设是正确的。第一部分是unix时代以来的毫秒数。第二部分是本地偏移,采用+/-hhmm格式,正值位于UTC以东,如ISO标准。这种愚蠢的格式来自.NET中的
JavaScriptSerializer
类。我们称之为“ASP.NET JSON日期”。现代.NET不再使用它了。@MattJohnson但是如果这个数字是UTC纪元的计数,那么偏移点是什么?将偏移量附加到UTC值不会增加任何值,因为任何人都可以将他们想要的任何偏移量应用到UTC值。人们仍然可以使用它来重建日期-时间偏移量值。只是我们通常会看到日期时间部分已经转换为偏移的本地时间-在这种情况下,日期时间部分是UTC。
String input = "1487615921387-0300";

String inputCount = input.substring ( 0 , 13 ); // zero-based index counting.
long count = Long.parseLong ( inputCount );
Instant instant = Instant.ofEpochMilli ( count );
String inputOffset = input.substring ( 13 );
ZoneOffset offset = ZoneOffset.of ( inputOffset );
OffsetDateTime odt = instant.atOffset ( offset );