在以下示例中,我成功解析了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?
谢谢
答案 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是同一时间(如果您的字符串非常特殊,并且对偏移量应用相反的约定,也可以解决,但需要一点时间更多的手工工作。