【问题标题】:String Date Handling with OffSet [duplicate]使用 OffSet 处理字符串日期 [重复]
【发布时间】:2021-06-16 23:25:28
【问题描述】:

我在从外部系统接收到的持久存储中具有日期时间。我需要使用它并将其设置为 Java 库例程的 Date 类型。这弄乱了在当前 jvm 时区下设置的相同内容。我知道偏移量可能不一定对应时区,但是,这会搞砸很多事情。

例如:

2020-08-14T08:59:34.961+05:30

示例代码:

String dateFromDatabase = "2020-08-14T08:59:34.961+05:30";
SimpleDateFormat outputDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
Date tempDate=outputDateFormat.parse(dateFromDatabase);
System.out.println( tempDate );

样本输出:

Thu Aug 13 23:29:34 EDT 2020

预期输出:

it should not return the EDT based datetime

我怎样才能让我的日期保持正确的偏移量?

关于如何实现这一点的任何建议/建议?

谢谢

【问题讨论】:

  • 使用不那么新的java.timepackage:ZonedDateTime.parse(dateFromDatabase)
  • @user15244370 是的,我试过了,但是它没有给我 Date 类型,这是我需要将它传递给库例程的...任何转换为​​ Date 类型的步骤都是问题。
  • Date 只是一个瞬间 - 如果您打印它 (toString),您将使用实际默认的 TimeZone 获得它的表示 - 所以 可能也在使用它(尝试,为了测试,改变TimeZone.setDefault(TimeZone.getTimeZone(zonedDate.getZone())(这可能会在代码的其他地方搞砸)
  • 据我了解,您想解析2020-08-14T08:59:34.961+05:30 并保持时间与08:59:34.961 一样,对吗?
  • 我建议你不要使用SimpleDateFormatDate。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。相反,只需使用来自java.time, the modern Java date and time APIOffsetDateTime

标签: java timezone offset timezone-offset datetimeoffset


【解决方案1】:

java.util.Date 对象不是像modern date-time types 这样的真实日期时间对象;相反,它表示自称为“纪元”的标准基准时间以来的毫秒数,即January 1, 1970, 00:00:00 GMT(或 UTC)。这意味着无论在世界的哪个位置,Date 对象都代表相同的数字(从纪元开始的毫秒数)。当您打印java.util.Date 的对象时,它的toString 方法会返回JVM 时区中的日期时间,从这个毫秒值计算得出。为了在不同的时区打印日期时间,我们将时区设置为SimpleDateFormat,并从中获取格式化字符串。

如果您不喜欢Thu Aug 13 23:29:34 EDT 2020 这样的输出,即Date#toString 在您的时区返回的字符串(并且在不同的时区会有所不同),有两种选择:

  1. 表示使用Date#getTime 获得的Date,以毫秒为单位(如上所述,在世界上的任何位置都相同)。
  2. 保留原字符串2020-08-14T08:59:34.961+05:30,因为它已经代表ISO8601 format 中的日期时间。

请注意,java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern date-time API*

现代日期时间 API 的演示:

import java.time.Instant;
import java.time.ZonedDateTime;
import java.util.Date;

public class Main {

    public static void main(String args[]) {
        String dateFromDatabase = "2020-08-14T08:59:34.961+05:30";
        ZonedDateTime zdt = ZonedDateTime.parse(dateFromDatabase);
        System.out.println(zdt);

        // If at all you need java.util.Date, you can get it from Instant
        Instant instant = zdt.toInstant();
        Date date = Date.from(instant);
    }
}

输出:

2020-08-14T08:59:34.961+05:30

Trail: Date Time 了解有关现代日期时间 API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

【讨论】:

    猜你喜欢
    • 2016-10-07
    • 2018-07-10
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多