在解析的时间戳Java的差异被忽略

问题描述 投票:0回答:3

在下面的例子我成功解析格式YYYYMMDDHHMMSS时间戳(+ - )HHss(日期加上或减去一些时间偏移)。

所以,当我给两个相同的时间戳和不同的转变,其结果应该是不同的。

例如,让我们的日期时间:190219010000(2019年2月19日,01:00 [AM]),我们可以添加2小时(时间会03:00)或减去2小时(时间将是23:00,日期将在2月18日) - 也就是说,解析对象应该有4个的小时差。

在下面,运行例如,时移忽略。我可以写任何数量和输出始终是“01:00 2019年2月,第19届”。

//Input timestamps: "190219010000+0200" "190219010000-0200"
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class HelloWorld
{
  public static void main(String[] args)
  { //parsing "19th of February 2019, 01:00 [AM]" +- 2hours
    LocalDateTime ldt1 = LocalDateTime.parse("190219010000+0200", DateTimeFormatter.ofPattern("yyMMddHHmmssx"));
    LocalDateTime ldt2 = LocalDateTime.parse("190219010000-0200", DateTimeFormatter.ofPattern("yyMMddHHmmssx"));
    System.out.println("190219010000+0200: " +ldt1);
    System.out.println("190219010000-0200: "+ ldt2);
  }
}

REAL输出:在两种情况下,输出是相同的,但输入不同:/

190219010000+0200: 2019-02-19T01:00
190219010000-0200: 2019-02-19T01:00

预期输出:

190219010000+0200: 2019-02-19T03:00
190219010000-0200: 2019-02-18T23:00

也许我应该用别的东西来代替在模式的X?或LocalDateTimeFormatter(不存在),而不是DateTimeFormatter?

谢谢

java date-parsing localtime
3个回答
1
投票

正如其他人所说,你误会了。在你的代码LocalDateTime.parse行为与设计。

你是正确的190219010000+0200在时间上是一个明确的点(因为我们知道,格式为yyMMddHHmmssx)。 LocalDateTime.parse给你的本地日期和时间是的字符串中。换句话说,本地日期和时间偏移+02:00。

如果你想转换,例如UTC,你需要指定明确的:

    OffsetDateTime odt1 = OffsetDateTime.parse("190219010000+0200", 
            DateTimeFormatter.ofPattern("yyMMddHHmmssx"));
    LocalDateTime ldt1 = odt1.withOffsetSameInstant(ZoneOffset.UTC)
            .toLocalDateTime();

    System.out.println("190219010000+0200: " + ldt1);

现在输出的是你所期望的一个。几乎。

190219010000 + 0200:2019-02-18T23:00

作为乔恩斯基特已经说过+0200通常指的是UTC的偏移+02:00已被应用到的日期和时间。所以,在01:00 +02:00在同一时间点为23:00前一天在UTC(如果你的字符串是非常特殊的,并申请偏移相反的约定,也可以得到解决,但需要一点点多手的工作)。


4
投票

在下面,运行例如,时移忽略。

是的,这并不让我感到吃惊。你解析所代表的本地价值 - 这是一个LocalDateTime的意义。

的“190219010000 + 0200”是指“2019年2月19日,凌晨1点本地时间,与UTC 2小时偏移”的字符串。的本地时间是2019-02-19T01:00。如果你不想让你的文字所代表的本地日期和时间,LocalDateTime是错误的类型使用。

它看起来像你真正想要的是UTC时间,在这种情况下,你应该解析值作为OffsetDateTime,然后可能转换为Instant。我期望的结果是在相反的方向从你虽然:+0200通常意味着“本地时间为UTC提前两小时”,使UTC值11点前一天 - 这不是量增加去世界标准时间。


2
投票

LocalDateTime没有时区信息,并不存储或代表一个时区。因此,在你的情况下,两个LDT1和LDT2表示相同的本地时间。

© www.soinside.com 2019 - 2024. All rights reserved.