在Java中使用各种日历时区(不使用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());

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

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

但是,Calendar本身确实知道时区,当您使用Calendar.get等时,这将反映出来。当您使用 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());

目前还不清楚您要做什么,但基本上您需要了解哪些类型可以识别时区,哪些类型不能。了解java.util.Date没有格式、日历系统或时区非常重要:它只是自 Unix 纪元以来的毫秒数。

正如 Jon 指出的那样,getTime() 返回一个 java.util.Date 对象,该对象只是一个毫秒值,无法识别时区。

如果您只是在打印时间,那么您可以使用日历并手动获取所需的字段,例如

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

这需要一些格式设置一分钟<10 才能显示 0

java.time

java.util日期-时间 API 及其格式设置 API SimpleDateFormat已过时且容易出错。建议完全停止使用它们,并切换到现代日期-时间 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

在线演示

Instant表示时间轴上的瞬时点,通常以 UTC 时间表示。输出中的Z是零时区偏移量的时区指示符。它代表祖鲁语,并指定Etc/UTC时区(时区偏移量为 +00:00 小时)。

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

Date date = Date.from(instant);

要了解有关现代日期-时间 API 的更多信息,请参阅跟踪:日期时间

永远不要使用 3 个字母的缩写时区 ID

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

为了与JDK 1.1.x兼容,其他一些三个字母的时区还支持 ID(例如"PST"、"CTT"、"AST")。然而,他们的use已弃用,因为相同的缩写通常用于多个时区(例如,"CST"可以是美国"中部"标准时间"和"中国标准时间"),Java平台可以然后只识别其中之一。

<小时 />

出于任何原因,如果你必须坚持使用Java 6或Java 7,你可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到Java 6和7。如果您正在为 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请查看通过脱糖提供的 Java 8+ API 和如何在 Android Project 中使用 ThreeTenABP。

相关内容

  • 没有找到相关文章

最新更新