我一直在寻找一种根据用户输入获取不同时区的当前时间的方法。 我知道我可以使用乔达时间!但这是唯一的方法吗?
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。