5

我的问题可能是微不足道的,但我只是在寻找澄清。我在某处读到 Java 的 Date() 实际上总是在 UTC 时间,当我创建一个 Date() 对象并使用 toString() 打印它时,它会显示本地时间。如果这不是打印它的正确方法,那应该是什么,这样我才能得到 UTC 时间?

4

3 回答 3

7

对于格式化,您应该真正使用DateFormat实现(例如SimpleDateFormat)。这将让您指定时区(和输出格式)。Date它本身没有时区的概念——它代表一个瞬间,使用“自 Unix 纪元以来的毫秒数”作为存储。该toString()方法只是使用系统默认时区将表示的任何时刻转换为本地时间。

就我个人而言,我建议完全放弃内置的日期/时间 API,并使用Joda Time作为更明智的库。

于 2011-05-10T08:42:11.043 回答
2
于 2019-01-17T04:30:31.807 回答
1

java.util.Date对象仅表示自称为“纪元”的标准基准时间(即 1970 年 1 月 1 日 00:00:00 GMT(或 UTC)以来的毫秒数)。由于它不保存任何时区信息,因此它的函数应用 JVM 的时区以从该毫秒值派生的格式toString返回 a 。要以不同的格式和时区表示对象,您需要使用所需的格式和适用的时区,例如StringEEE MMM dd HH:mm:ss zzz yyyyStringjava.util.DateSimpleDateFormat

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        Date date = new Date();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);

        sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
        String strDateNewYork = sdf.format(date);
        System.out.println(strDateNewYork);

        sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
        String strDateUtc = sdf.format(date);
        System.out.println(strDateUtc);
    }
}

输出:

2021-06-20T09:43:39.517-04:00
2021-06-20T13:43:39.517Z

ONLINE DEMO

java.time

java.util日期时间 API 及其格式化 API已SimpleDateFormat过时且容易出错。建议完全停止使用它们并切换到现代 Date-Time API *

另外,下面引用的是来自Joda-Time主页的通知:

请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

使用java.time现代日期时间 API 的解决方案:

import java.time.Instant;

public class Main {
    public static void main(String[] args) {
        Instant now = Instant.now();
        System.out.println(now);
    }
}

输出:

2021-06-20T13:37:42.174352Z

ONLINE DEMO

An代表UTCInstant时间线上的一个瞬时点。输出中的 是零时区偏移的时区指示符。它代表 Zulu 并指定时区(时区偏移量为小时)。ZEtc/UTC+00:00

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


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

于 2021-06-20T13:39:01.717 回答