【问题标题】:Converting a string to date format when the String ends in Z当字符串以 Z 结尾时将字符串转换为日期格式
【发布时间】:2019-02-11 20:08:31
【问题描述】:

我必须将以下字符串解析为更易读的日期格式。

字符串日期 = "20190112151605.0Z";

但是,我以前从未遇到过 Z。我知道这与时区有关,但是当我尝试使用我常用的代码时,我得到一个 java.lang.NumberFormatException。

我的代码如下:

 String whenChanged = "20190112151605.0Z";  

 long DIFF_NET_JAVA_FOR_DATE_AND_TIMES = 11644473600000L;
 long adDate1 = Long.parseLong(whenChanged);
 long adLongDate1 = ( adDate1  / 10000 ) - DIFF_NET_JAVA_FOR_DATE_AND_TIMES;
 Date lastLogonDate1 = new Date(adLongDate1);
 String format2 = new SimpleDateFormat("MM/dd/yyyy 
 HH:mma'Z'").format(lastLogonDate1);

任何帮助都会很棒。谢谢

【问题讨论】:

标签: java date simpledateformat


【解决方案1】:

这样就可以了。 Z 表示 UTC 时区

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyyMMddHHmmss.Sz");
ZonedDateTime parsed = ZonedDateTime.parse("20190112151605.0Z", fmt);

System.out.println(parsed);     // prints 2019-01-12T15:16:05

DateTimeFormatter

【讨论】:

  • 优雅,感谢您展示了 java.time 的使用,这是现代 Java 日期和时间 API。虽然小写的z(时区名称)可以用于解析Z,但习惯上使用大写的X(区域偏移“Z”表示零),如uuuuMMddHHmmss.SX
  • 谢谢,是的,我看到X 在这个例子中也有效。如DateTimeFormatter 的链接文档
【解决方案2】:

你有必要对这些时区做些什么吗?

如果没有,你可以这样做

if(whenChanged.contains('Z')){
   whenChanged = whenChanged.substring(0,date.indexOf('Z'));
}

【讨论】:

  • 为什么要删除小数秒,而只需要删除祖鲁时区?
  • 我认为句号表示时区指定的开始。我会编辑以反映这一点。谢谢!
  • Z 表示与 UTC 的偏移量为零,需要按此进行解析,否则您将得到不正确的时间(在大多数计算机上)。
猜你喜欢
  • 2013-07-15
  • 2014-08-10
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 2014-01-18
  • 2019-10-13
相关资源
最近更新 更多