微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java用“Z”而不是“+”格式化时间戳

如何解决java用“Z”而不是“+”格式化时间戳

使用 java 我尝试使用 SimpleDateFormat 使用时区格式化当前日期

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSSZ");
sdf.format(new Date());

这给了我结果:

   2021-04-28T13:45:52:308+0300

我想使用“Z”而不是“+”获取时区格式

想要的结果:"2021-04-28T13:45:52:308Z03:00"

我将日期输出写入文件日志中,该日志将由用 Go 语言编写的 Telegraf 插件解析,该插件期望日期与时区的格式如下:json_time_format = "2006-01-02T15:04:05Z07:00"

是否有模式允许?

解决方法

Z 表示“祖鲁时间”或零小时偏移,即 UTC +0:00

如果您不在那个时区,使用它是不正确的。如果用 Z 替换它,你怎么知道你是在子午线之前还是之后?鉴于 Z03:00,您将其解析为 +03:00 还是 -03:00

,

由于 Z 表示祖鲁语时间偏移,因此您不能将其用作格式字符串的一部分,但您当然可以添加 Z 作为硬编码字符

ZonedDateTime now = ZonedDateTime.now();
  
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'Z");
System.out.println(formatter.format(now));

2021-04-29T15:34:17.661Z+0200

然后,如果您不想要“+”,您可以在之后将其删除,但不清楚如何使用“-”,因此我将其排除在答案之外。

,

从语义上讲,如上所述它是完全错误的。但是您可以通过一些自定义解析逻辑来实现这一点。 我会假设两件事:

  1. 日期将不包含具有负差异的时区
  2. 日期格式不会改变

在任何其他情况下,这都不安全!! 但是给你:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSSZ");
String originalDateString = sdf.format(new Date());
String[] parts = originalDateString.split("\\+");
StringBuilder sb = new StringBuilder(parts[1]);
sb.insert(2,':');
parts[1] = sb.toString();
String result = String.join("Z",parts);
System.out.println(result);

这将由此创建: 2021-04-29T14:12:21:376+0000

这个: 2021-04-29T14:12:21:376Z00:00

,

你误会了。 2006-01-02T15:04:05Z07:00 并不意味着你应该用 Z 而不是加号(那么你会用什么来代替减号?)这种指定日期和时间格式的方式近似于固定示例日期Mon Jan 2 15:04:05 MST 2006 的时间将被格式化,但这只是一个近似值。具体而言,当涉及到 UTC 的偏移量时,该格式在偏移量为零时需要 Z,在非零时需要 +hh:mm-hh:mm。符合 ISO 8601 和 RFC-3339。您会立即看到,仅给出示例日期和时间的正确格式 2006-01-02T15:04:05-07:00,不会告诉读者偏移量 0 应指定为 Z。因此,此特定要求在格式中指定为 Z07:00。根据格式化时间或日期[完整指南](底部链接),您的特定格式 2006-01-02T15:04:05-0700 表示 ISO 8601 或 RFC-3339。

所以您需要做的就是使用 DateTimeFormat.ISO_OFFSET_DATE_TIMEOffsetDateTime.toString()

下面是几个例子。

    String result = OffsetDateTime.now().toString();
    System.out.println(result);

刚刚在我的时区在 Java 8 上运行时的输出:

2021-04-29T17:00:55.716+02:00

如果不允许使用秒的分数——好吧,根据 ISO 8601,它是可选的,所以应该是,但如果不是:

    String result = OffsetDateTime.now().truncatedTo(ChronoUnit.SECONDS)
            .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);

2021-04-29T17:00:55+02:00

如果您从遗留代码中获得了老式的 Date 对象,请在格式化之前对其进行转换:

    Date oldfashionedDate = new Date();
    String result = oldfashionedDate.toInstant()
            .atZone(ZoneId.systemDefault())
            .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);

2021-04-29T17:00:55.739+02:00

链接

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?