1

我正在寻找一种方法来根据用户输入获取不同时区的当前时间。我知道我可以使用Joda Time!但这是唯一的方法吗?

Java中没有这样做的选项吗?我尝试了以下代码,它为所有 3 个系统输出提供了相同的输出。

Calendar pst = Calendar.getInstance(TimeZone.getTimeZone("PST"));
System.out.println("PST " + pst.getTime());
Calendar ist = Calendar.getInstance(TimeZone.getTimeZone("Asia/Calcutta"));
System.out.println("IST " + ist.getTime());
Calendar utc = Calendar.getInstance(TimeZone.getTimeZone("Etc/UTC"));
System.out.println("UCT " + utc.getTime());

我在这里缺少什么来获取其他时区的当前时间?

4

3 回答 3

6

是的,这将在每种情况下(或相隔毫秒)显示相同的值,因为三个日历都指的是同一时刻(尽管执行时间),这就是 a 所java.util.Date代表的全部。这就是 的结果Calendar.getTime()

但是,它Calendar本身确实知道时区,并且会在您使用Calendar.get等时反映出来。它也会您使用时使用 a SimpleDateFormat,您可以在其中指定特定时区。

// Specify whatever format you want - bear in mind different locales etc
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
format.setTimeZone(calendar.getTimeZone());
String text = format.format(calendar.getTime());

目前尚不清楚您到底要做什么,但基本上您需要知道哪些类型是时区感知的,哪些不是。理解 ajava.util.Date没有格式、日历系统或时区非常重要:它只是自 Unix 纪元以来的毫秒数。

于 2013-10-30T21:00:04.673 回答
1

正如乔恩指出的那样,该方法getTime()返回的java.util.Date对象只是一个毫秒值,并且不知道时区。

如果您只是在查看打印时间,那么您可以使用日历并手动获取您想要的字段

System.out.println(utc.get(Calendar.HOUR_OF_DAY) + ":" + utc.get(Calendar.MINUTE))

这需要一分钟 < 10 的一些格式来显示 0

于 2013-10-30T21:04:58.407 回答
0

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;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

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

        ZonedDateTime zdtLos = now.atZone(ZoneId.of("America/Los_Angeles"));
        ZonedDateTime zdtIndia = now.atZone(ZoneId.of("Asia/Kolkata"));
        ZonedDateTime zdtUtc = now.atZone(ZoneOffset.UTC);

        System.out.println(zdtLos);
        System.out.println(zdtIndia);
        System.out.println(zdtUtc);
    }
}

示例运行的输出:

2021-07-26T12:39:17.413671-07:00[America/Los_Angeles]
2021-07-27T01:09:17.413671+05:30[Asia/Kolkata]
2021-07-26T19:39:17.413671Z

ONLINE DEMO

AnInstant表示时间线上的一个瞬时点,通常以UTC时间表示。Z输出中的 是零时区偏移的时区指示符。它代表 Zulu 并指定Etc/UTC时区(时区偏移量为+00:00小时)。

出于任何原因,如果您需要将此对象转换Instant为 的对象java.util.Date,您可以执行以下操作:

Date date = Date.from(instant);

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

切勿使用 3 个字母缩写的时区 ID

以下是文档页面TimeZone的摘录:

为了与 JDK 1.1.x 兼容,还支持一些其他的三字母时区 ID(例如“PST”、“CTT”、“AST”)。但是,不推荐使用它们,因为相同的缩写通常用于多个时区(例如,“CST”可能是美国“中部标准时间”和“中国标准时间”),Java 平台只能识别其中之一他们。


* 出于任何原因,如果您必须坚持使用 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-07-26T19:48:14.233 回答