我必须以这种格式输入日期时间:
"2018-07-17T12:16:50.52Z"
因此,我正在使用:
private static final SimpleDateFormat LIVETRACK_DATE_TIME_FORMATTER =
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
DATE_TIME_FORMATTER.parse(timeFrameFrom);
但是运行测试用例时出现以下错误:
Tue Jul 17 1[2:20:50 CES]T 2018> but was:<Tue Jul 17 1[0:20:50 GM]T 2018>
这是否意味着我应该将日期转换为GMT格式? 如何转换?
答案 0 :(得分:1)
如果您使用的是Java8,则可以使用java.time API,在其中可以使用Instant
的默认日期时间格式来解析String:
ZonedDateTime zdt = Instant.parse("2018-07-17T12:16:50.52Z")
.atZone(ZoneId.of("Europe/Berlin"));
输出
2018-07-17T14:16:50.520+02:00[Europe/Berlin]
答案 1 :(得分:1)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"EEE MMM dd HH:mm:ss zzz yyyy 'Uhr'", Locale.ROOT);
String input = "2018-07-17T12:16:50.52Z";
ZonedDateTime dateTime = Instant.parse(input)
.atZone(ZoneId.of("Europe/Berlin"));
String output = dateTime.format(formatter);
System.out.println(output);
输出:
2018年7月17日星期二CEST Uhr
您的测试用例期望错误的结果。输入字符串中的Z
表示UTC(从UTC偏移零或所谓的Zulu时区)。 UTC的时间12:16:50.52与中欧夏令时(CEST)的14:16:50.52相同。因此,要求Tue Jul 17 12:20:50 CEST 2018 Uhr
是错误的。
在您的代码中,您将Z
硬编码为文字,而不是按照需要将其解析为偏移量。有趣的是,这产生了单元测试预期的错误时间点,只是不在预期的时区。这 可能与Date.toString
有关,使用的是JVM的时区设置,并且测试期望这是CEST,而实际上是GMT。但是您的SimpleDateFormat
并未使用GMT解析字符串(可能是CEST),因此您没有给我们足够的信息来解释测试中发生的一切。除非您明确设置其时区,否则SimpleDateFormat
将使用相同的JVM设置,在您发布的代码中不会发生这种情况。
链接: Oracle tutorial: Date Time解释了如何使用java.time
。
答案 2 :(得分:0)
这里是将日历中的日期转换为不同时区的示例。
TimeZone tzLA = TimeZone.getTimeZone("America/Los_Angeles");
TimeZone tzIN = TimeZone.getTimeZone("Asia/Calcutta");
Calendar calendar = new GregorianCalendar();
calendar.setTimeZone(tzLA);
long timeLA = calendar.getTimeInMillis();
System.out.println("Time at America in milliseconds = " +timeLA);
System.out.println("Hour at America = " +calendar.get(Calendar.HOUR_OF_DAY));
calendar.setTimeZone(tzIN);
long timeIN = calendar.getTimeInMillis();
System.out.println("Time at Asia in millis = " + timeIN);
System.out.println("Hour at Asia = " + calendar.get(Calendar.HOUR_OF_DAY));
这是输出。
Time at America in milliseconds = 1515136660357
Hour at America = 23
Time at Asia in millis = 1515136660357
Hour at Asia = 12
答案 3 :(得分:0)
这是否意味着我应该将日期转换为GMT格式?
否,这意味着'Z'不应该像'T'那样用作常量分隔符,而应视为表示日期所在时区的完整字段。 Z表示GMT时区。
您的格式应该确实是
=SUM((MOD(A1:A12,2^$E$1)>=2^($E$1-1))+0)
这将使SimpleDateFormat识别Z指示GMT时区,因此其产生的日期将与GMT时区对齐。将其转换为String并因此转换为德国时区时,它将添加时差并产生预期的结果。
话虽如此,更好的解决方案是从过时的类java.util.Date和SimpleDateFormat继续,并使用Java 8的java.time。* API。参见其他答案以获取灵感。