所解析的时间戳记中的Java差异将被忽略

时间:2019-02-06 09:26:42

标签: java date-parsing localtime

在以下示例中,我成功解析了yyMMddHHmmss(+-)HHss(日期加上或减去某些时移)格式的时间戳。

因此,当我给出两个相同的时间戳记和一个不同的班次时,结果应该是不同的。

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

在下面的运行示例中,将忽略时移。我可以写任何数字,输出总是“ 2019年2月19日,01:00”。

//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?

谢谢

3 个答案:

答案 0 :(得分:4)

  

在下面的运行示例中,时移被忽略。

是的,这并不令我感到惊讶。您正在解析表示的 local 值-这就是LocalDateTime的含义。

字符串“ 190219010000 + 0200”表示“ 2019年2月19日,当地时间凌晨1点,UTC偏移为2小时”。该的本地时间是 2019-02-19T01:00。如果您不想获取由文本表示的本地日期和时间,则LocalDateTime是错误的类型。

您真正想要的是UTC时间,在这种情况下,您应该将值解析为OffsetDateTime,然后可能转换为Instant。我希望结果与您的方向相反:+0200通常表示“当地时间比UTC时间早两个小时”,使UTC值在前一天晚上11点-不是添加到 get 到UTC的金额。

答案 1 :(得分:2)

LocalDateTime 没有时区信息,也不存储或表示时区。因此,在您的情况下, ldt1 ldt2 代表相同的本地时间。

答案 2 :(得分: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

如乔恩·斯基特(Jon Skeet)所说,+0200通常意味着对日期和时间应用了+02:00 的UTC偏移量。因此,+ 02:00的01:00与UTC的前一天23:00是同一时间(如果您的字符串非常特殊,并且对偏移量应用相反的约定,也可以解决,但需要一点时间更多的手工工作。