时区转换tl;博士详避免 java.util.Date & .日历java.time城大时间

2022-08-31 20:24:45

我需要在我的项目中从一个时区转换为另一个时区。

我可以从当前时区转换为另一个时区,但不能从其他时区转换为另一个时区。

例如,我在印度,我能够使用日历对象并将其分配给日历对象并设置时区从印度转换为美国。Date d=new Date();

但是,我无法从不同的时区到另一个时区执行此操作。例如,我在印度,但在将时区从美国转换为英国时遇到问题。


答案 1

tl;博士

ZonedDateTime.now( ZoneId.of( "Pacific/Auckland" ))              // Current moment in a particular time zone.
             .withZoneSameInstant( ZoneId.of( "Asia/Kolkata" ))  // Same moment adjusted into another time zone. 

java.util.Date 类没有分配时区,但它的实现令人困惑地应用了 JVM 的当前默认时区。toString

避免 java.util.Date & .日历

这是避免臭名昭着的麻烦的java.util.Date,的众多原因之一。Calendar 和 SimpleDateFormat 类与 Java 捆绑在一起。避免它们。请改用:

java.time

Java 8 及更高版本内置了 java.time 包。这个包装的灵感来自Joda-Time。虽然它们有一些相似之处和类名,但它们是不同的;每个都有其他缺少的功能。一个值得注意的区别是java.time避免构造函数,而是使用静态实例化方法。这两个框架都由同一个人斯蒂芬·科尔本(Stephen Colbourne)领导。

ThreeTen-Backport项目中,许多java.time功能已经向后移植到Java 6和7。在ThreeTenABP项目中进一步适应Android。

就这个问题而言,它们以同样的方式工作。指定时区,并调用 now 方法获取当前时刻,然后基于旧的不可变实例创建新实例以调整时区。

请注意两个不同的时区类。一个是命名时区,包括夏令时和其他此类异常的所有规则,加上与 UTC 的偏移量,而另一个只是偏移量。

ZoneId zoneMontréal = ZoneId.of("America/Montreal"); 
ZonedDateTime nowMontréal = ZonedDateTime.now ( zoneMontréal );

ZoneId zoneTokyo = ZoneId.of("Asia/Tokyo"); 
ZonedDateTime nowTokyo = nowMontréal.withZoneSameInstant( zoneTokyo );

ZonedDateTime nowUtc = nowMontréal.withZoneSameInstant( ZoneOffset.UTC );

城大时间

以下是Joda-Time 2.3中的一些示例代码。搜索 StackOveflow 以获取更多示例和大量讨论。

DateTimeZone timeZoneLondon = DateTimeZone.forID( "Europe/London" );
DateTimeZone timeZoneKolkata = DateTimeZone.forID( "Asia/Kolkata" );
DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );

DateTime nowLondon = DateTime.now( timeZoneLondon ); // Assign a time zone rather than rely on implicit default time zone.
DateTime nowKolkata = nowLondon.withZone( timeZoneKolkata );
DateTime nowNewYork = nowLondon.withZone( timeZoneNewYork );
DateTime nowUtc = nowLondon.withZone( DateTimeZone.UTC );  // Built-in constant for UTC.

我们在宇宙的时间线中有同一时刻的四种表示。


实际上,该类在其源代码确实有一个隐藏在时区中。但是,出于大多数实际目的,该类忽略了该时区。因此,作为简写,人们常说j.u.Date没有分配时区。混乱?是的。避免j.u.Date的混乱,并使用Joda-Time和/或java.time。java.util.Date


答案 2

一些例子

在时区之间转换时间

在时区之间转换时间

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class TimeZoneExample {
    public static void main(String[] args) {
        // Create a calendar object and set it time based on the local
        // time zone
        Calendar localTime = Calendar.getInstance();
        localTime.set(Calendar.HOUR, 17);
        localTime.set(Calendar.MINUTE, 15);
        localTime.set(Calendar.SECOND, 20);

        int hour = localTime.get(Calendar.HOUR);
        int minute = localTime.get(Calendar.MINUTE);
        int second = localTime.get(Calendar.SECOND);


        // Print the local time
        System.out.printf("Local time  : %02d:%02d:%02d\n", hour, minute, second);


        // Create a calendar object for representing a Germany time zone. Then we
        // wet the time of the calendar with the value of the local time

        Calendar germanyTime = new GregorianCalendar(TimeZone.getTimeZone("Europe/Berlin"));
        germanyTime.setTimeInMillis(localTime.getTimeInMillis());
        hour = germanyTime.get(Calendar.HOUR);
        minute = germanyTime.get(Calendar.MINUTE);
        second = germanyTime.get(Calendar.SECOND);


        // Print the local time in Germany time zone
        System.out.printf("Germany time: %02d:%02d:%02d\n", hour, minute, second);
    }
}