【问题标题】:using simpledateformat to parse string date with 6 digit of milliseconds [duplicate]使用simpledateformat以6位毫秒解析字符串日期[重复]
【发布时间】:2020-03-30 23:57:37
【问题描述】:

我正在尝试将字符串日期解析为特定的日期格式,但是当我使用SimpleDateFormat 提供的选项时,我总是得到不同的结果。这是我要解析的字符串:

String datetToParse = ""2019-07-04 00:32:08:627158"" into  04-JUL-19 12.32.08.627158000 AM. 

我可以使用 simpledateformat 或任何其他日期格式化程序来实现这一点吗?任何帮助将不胜感激。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormat {

    public static void main(String[] args) {
        String date = "2019-07-04 00:32:08:627158";

        SimpleDateFormat sf = new SimpleDateFormat("yymmdd");
        Date d = null;
        try {
            d= sf.parse(date);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(d);

    }

}

【问题讨论】:

  • 你期待什么输出?
  • 你的输入看起来像190704吗?那你为什么要用那种格式来解析它呢? mm 也是分钟(所以这将是 193204... 即您的格式不正确)。这是一个有用的技巧:System.out.println(sf.format(new Date())); 如果这看起来不像您的输入,那么格式不正确。
  • @ElliottFrisch 是的,我的格式不正确,我尝试了 simpedateformat 中的许多其他选项,但无法获得所需的输出。这是我的愿望输出:04-JUL-19 12.32.08.627158000 AM。
  • 在尝试创建输出之前先解析输入。警告的话,您的格式似乎包括纳秒;这不容易解析。
  • 如何在输出中得到12 AM?你在找这个2019-Jul-04 00:32:08:627158000 AM@MaheshMishra 吗?

标签: java


【解决方案1】:

您应该在java.timejava.time.format 包中使用新的DateTimeFormatterLocalDateTime,而不是长期弃用的SimpleDateFormatjava.util.Date。如果除了SimpleDateFormat 之外没有其他原因不提供纳秒分辨率(并且您的输入似乎有纳秒)。

类似的,

String date = "2019-07-04 00:32:08:627158";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
    "yyyy-MM-dd HH:m:ss:nnnnnn");
LocalDateTime ldt = LocalDateTime.parse(date, formatter);
DateTimeFormatter outFormatter = DateTimeFormatter.ofPattern(
    "dd-MMM-yy hh.mm.ss.nnnnnn a");
System.out.println(outFormatter.format(ldt));

输出

04-Jul-19 12.32.08.627158 AM

如果您想要JUL,请添加toUpperCase() 调用,如果您需要额外的三个零,请在outFormatter 中添加它们。喜欢,

DateTimeFormatter outFormatter = DateTimeFormatter.ofPattern(
        "dd-MMM-yy hh.mm.ss.nnnnnn000 a");
System.out.println(outFormatter.format(ldt).toUpperCase());

输出

04-JUL-19 12.32.08.627158000 AM

不清楚这三个零是从哪里来的,如果你想要更精确的话我会使用

DateTimeFormatter outFormatter = DateTimeFormatter.ofPattern(
        "dd-MMM-yy hh.mm.ss.nnnnnnnnn a");
System.out.println(outFormatter.format(ldt).toUpperCase());

但输出(如我所料)

04-JUL-19 12.32.08.000627158 AM

【讨论】:

  • 您的代码中有两个错误。它首先将2019-07-04 00:32:08:627158 解析为2019-07-04T00:32:08.000627158。小数位向右移动 3 个位置。然后它将2019-07-04T00:32:08.000627158 格式化为04-jul.-19 12.32.08.627158 AM。这次相同的数字向左移动了 3 个位置。所以这两个错误平衡了,你没有发现。对于正确的代码,在第一个格式化程序中使用SSSSSS 而不是nnnnnn,在第二个格式化程序中使用SSSSSSSSS
【解决方案2】:

如果您的小数部分是以 0 到 6 位数字(最多 999,999 微秒)的形式写入的微秒,那么您可以在格式化程序中指定 ChronoFIeld.MICRO_OF_SECOND

DateTimeFormatter msecFormatter = new DateTimeFormatterBuilder()
    .appendPattern("yyyy-MM-dd HH:mm:ss:")
    .appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, false)
    .toFormatter();

LocalDateTime ldt = LocalDateTime.parse("2019-07-04 00:32:08:627158", msecFormatter);
DateTimeFormatter nsFormatter = DateTimeFormatter.ofPattern("dd-MMM-yy hh.mm.ss.n a");
System.out.println(nsFormatter.format(ldt).toUpperCase());

【讨论】:

  • 您的nsFormatter 不正确。在这个例子中它给出了正确的输出,但是例如2019-07-04 00:32:08:007158被格式化为04-JUL.-19 12.32.08.7158000 AM。小数位向左移动了两个位置。
  • @OleV.V.这是正确的。注意单位。这假设输入格式使用 微秒(小数部分为 6 位),输出使用 ISO-8601 纳秒(1 us = 1,000 ns)。
猜你喜欢
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
相关资源
最近更新 更多