【问题标题】:Format String yyyy-mm-dd hh:mm:ss +timezone into DateTime将字符串 yyyy-mm-dd hh:mm:ss +timezone 格式化为 DateTime
【发布时间】:2018-08-17 11:35:33
【问题描述】:

我需要格式化一个如下所示的字符串:

"2018-07-20 18:53:46.598000 +02:00:00" 

像这样进入一个 DateTime 对象:

20/07/2018 (HH with Timezone applied):53:46

我的方法是:

String dateTimePattern = "dd/MM/yyyy HH:mm:ss";
SimpleDateFormat dateTimeFormat = new SimpleDateFormat(dateTimePattern);                                                                                                                                                         
Date feUltModDateTime = dateTimeFormat.parse(feUltMod);
feUltMod = feUltModDateTime.toString();

但我遇到了解析错误:

java.text.ParseException: Unparseable date: "2018-07-20 18:53:46.598000 +02:00:00"

【问题讨论】:

标签: java datetime parsing timezone


【解决方案1】:

java.time

    DateTimeFormatter origFormatter 
            = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSS XXXXX");
    DateTimeFormatter desiredFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm:ss");
    ZoneId desiredZone = ZoneId.of("America/Fort_Nelson");

    String feUltMod = "2018-07-20 18:53:46.598000 +02:00:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(feUltMod, origFormatter);
    ZonedDateTime dateTimeWithTimeZoneApplied = dateTime.atZoneSameInstant(desiredZone);
    feUltMod = dateTimeWithTimeZoneApplied.format(desiredFormatter);
    System.out.println(feUltMod);

这个 sn-p 的输出是:

20/07/2018 09:53:46

通常,您需要两个格式化程序来将日期或日期时间从一种格式转换为另一种格式:一个指定要转换的格式,另一个指定要转换的格式到。

像这样进入 DateTime 对象

日期时间对象没有格式,因此在这方面不能“像这样”。上面sn-p中的dateTimeWithTimeZoneApplied是在指定的时区,所以调整了小时。转换到这个时区后,我已经按照你提到的格式格式化成一个字符串,以防你想要这个(我没有发现它很清楚)。

我正在使用并推荐 java.time,它是现代 Java 日期和时间 API。您使用的日期和时间类 DateSimpleDateFormat 早已过时且设计不佳,不值得为它们挣扎。此外,SimpleDateFormat 仅支持毫秒,因此只能在精确到 3 位小数的情况下正确工作,而不是在您拥有的 6 位小数下。

链接:Oracle tutorial: Date Time解释如何使用java.time

【讨论】:

  • 你当老板
【解决方案2】:
    final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    Date df = new Date();
    String yourString = sdf.format(df);

    Date parsedDate = sdf.parse(yourString);
    Timestamp sqlDate = new java.sql.Timestamp(parsedDate.getTime());

上面的代码会给你当前的时间戳。时间戳会提供更好的可行性

【讨论】:

  • 我看不出这会如何回答这个问题。您的代码只是在我的计算机上给出了2018-08-17 13:20:00.0,而不是要求的20/07/2018 (HH with Timezone applied):53:46。此外,您应该避免使用过时且设计不佳的日期时间类 SimpleDateFormatDateTimestamp
  • 仅供参考,非常麻烦的旧日期时间类,例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat,现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
  • 2013-11-01
相关资源
最近更新 更多