首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中验证时间戳格式yyyy‘ssZ:mm:ssZ?

在java中验证时间戳格式yyyy‘ssZ:mm:ssZ?
EN

Stack Overflow用户
提问于 2014-09-24 06:16:38
回答 3查看 30.5K关注 0票数 6

我正在尝试使用joda time-1.6.2进行时间戳验证。请指出我的错误并帮助我解决问题。

代码语言:javascript
复制
String timestamp = "2014-09-23T23:03:11Z";
String datePattern = "yyyy-MM-dd'T'HH:mm:ssZ";

try {
             DateTimeFormatter dateFormatter = DateTimeFormat.forPattern(datePattern);
             dateFormatter.parseDateTime(timestamp);

        } catch (Exception e) {
            LOG.info("Timestamp is invalid format" + e);
        }

异常

代码语言:javascript
复制
INFO: Timestamp is invalid formatjava.lang.IllegalArgumentException: Invalid format: "2014-09-23T23:03:11Z" is malformed at "Z"
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-24 06:29:05

为了不仅得到一个vaild时间戳格式,而且还有零偏移从UTC使用。

代码语言:javascript
复制
String timestamp = "2014-09-23T23:03:11Z";
DateTime dt = new DateTime(timestamp, DateTimeZone.UTC);

否则/陷阱

如果不显式地将时间戳指定为UTC,则可能假定本地时间的偏移量为零。此外,虽然以下可能是一种有效的模式,但也有些误导。

代码语言:javascript
复制
String timestamp = "2014-09-23T23:03:11Z";
String datePattern = "yyyy-MM-dd'T'HH:mm:ss'Z'";

正如Meno所描述的,这将零时区偏移量视为文字(因此忽略它)。

同时考虑一下对更详细地解释这个问题的答案,因为我现在不允许删除我的(已接受的答案)。

票数 -3
EN

Stack Overflow用户

发布于 2014-09-24 10:06:22

我非常怀疑把Z当作字面上的东西。 char Z有一个意思,即零偏移量。-- Joda-Time版本1.6的文档说明了这段代码:

代码语言:javascript
复制
String timestamp = "2014-09-23T23:03:11Z";
DateTime dt = 
  ISODateTimeFormat.dateTimeNoMillis().parseDateTime(timestamp).withZone(DateTimeZone.UTC);
System.out.println(dt); // 2014-09-23T23:03:11.000Z

返回一个没有millis的完整日期和时间组合的格式化程序,以'T‘分隔(yyyy’T‘mm:mm:ssZZ)。时区偏移为“Z”表示为零,形式为“±HH:mm”为非零。

现在让我们详细查看以下四个备选方案(使用版本1.6.2进行显式测试):

代码语言:javascript
复制
String timestamp = "2014-09-23T23:03:11Z";
DateTimeZone utc = DateTimeZone.UTC;

DateTime dt1 = ISODateTimeFormat.dateTimeNoMillis().parseDateTime(timestamp).withZone(utc);
System.out.println(dt1); // 2014-09-23T23:03:11.000Z (OK)

DateTime dt2 = new DateTime(timestamp, utc);
System.out.println(dt2); // 2014-09-23T23:03:11.000Z (OK)

DateTime dt3 =
  DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'").parseDateTime(timestamp).withZone(utc);
System.out.println(dt3); //2014-09-23T21:03:11.000Z (WRONG!!!)

DateTime dt4 =
  DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ").parseDateTime(timestamp).withZone(utc);
// exception: Invalid format: "2014-09-23T23:03:11Z" is malformed at "Z"

结论:到目前为止给出的其他答案都是错误的,因为输入是在局部时区处理的,而不是用偏移量UTC+00:00处理的。使用构造函数或特定的类IsoDateTimeFormat (为了清楚起见,我更喜欢后者)。

关于异常:--这是一个用2.0版本解决的bug,请参阅释放-备注。你最好更新你的库版本。

允许格式模式中的“Z”和“ZZ”解析“Z”为'+00:00‘2827359

票数 10
EN

Stack Overflow用户

发布于 2014-09-24 06:23:13

来自v1.6 API文档

'Z‘输出没有冒号的偏移量,'ZZ’用冒号输出偏移量,'ZZZ‘或更多输出区域id。

当您在模式中指定Z (没有单引号)时,时间戳中的值必须以+HHMM-HHMM格式作为与UTC的数字偏移。文字字符Z是指定格式的无效输入。

示例:

  • 2014-09-23T23:03:11+0000
  • 2014-09-23T23:03:11-0500
  • 2014-09-23T23:03:11+0430

正如莱维特在另一个答案中提到的那样,如果目标是接受输入时间戳中的文字“Z”,而不将其视为时区(糟糕的想法),则可以使用模式中的单引号(...'Z')引用Z字符。这类似于对分隔日期组件和时间组件的文字'T‘所做的操作。不建议将输入中的Z视为文字,因为它有意义,如果提供,则时区是时间戳的一个重要组成部分。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26009841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档