在下面的例子我成功解析格式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?
谢谢
正如其他人所说,你误会了。在你的代码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(如果你的字符串是非常特殊的,并申请偏移相反的约定,也可以得到解决,但需要一点点多手的工作)。
在下面,运行例如,时移忽略。
是的,这并不让我感到吃惊。你解析所代表的本地价值 - 这是一个LocalDateTime
的意义。
的“190219010000 + 0200”是指“2019年2月19日,凌晨1点本地时间,与UTC 2小时偏移”的字符串。的本地时间是2019-02-19T01:00。如果你不想让你的文字所代表的本地日期和时间,LocalDateTime
是错误的类型使用。
它看起来像你真正想要的是UTC时间,在这种情况下,你应该解析值作为OffsetDateTime
,然后可能转换为Instant
。我期望的结果是在相反的方向从你虽然:+0200通常意味着“本地时间为UTC提前两小时”,使UTC值11点前一天 - 这不是量增加去世界标准时间。
LocalDateTime没有时区信息,并不存储或代表一个时区。因此,在你的情况下,两个LDT1和LDT2表示相同的本地时间。