Java程序在时区之间进行转换

时间:2020-01-09 10:35:32  来源:igfitidea点击:

在本文中,我们将介绍如何在Java中的不同时区之间转换日期和时间。

这里提供了两个Java程序

1如果我们没有使用Java 8日期和时间API,请使用Calendar类进行转换。
2为此使用Java 8 Data and Time API,该类具有ZoneId和ZonedDateTime之类的类。

在此处给出的示例中,我们将来源作为印度时间(区域ID" Asia / Kolkata")

它将转换为PST(区域ID" America / Los_Angeles")

使用Java 8 API在不同时区之间转换日期和时间

该程序在不同时区之间转换日期和时间的步骤如下:

1使用java.time.ZoneId类的of()方法为两个时区创建两个Zone ID。
2为源日期时间创建ZonedDateTime实例。
3使用java.time.ZonedDateTime的withZoneSameInstant(ZoneId zone)方法,该方法返回具有不同时区的该日期时间的副本,并保留该时刻。这给出了转换后的时区中的日期时间。

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class ConvertDate {
  public static void main(String[] args) {
    ZoneId IndiaZone = ZoneId.of("Asia/Kolkata");	
    ZoneId CaliforniaZone = ZoneId.of("America/Los_Angeles");	
		  
    String dateTime = "2019-10-20 10:30:45 AM";
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss a");
    LocalDateTime ldt = LocalDateTime.parse(dateTime, dtf);
		  
    // Source ZonedDateTime
    ZonedDateTime IndiaTime = ZonedDateTime.of(ldt, IndiaZone);
    System.out.println("India Date-Time- " + IndiaTime);
    DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm:ss a");
    // Formatting as per local datetime format
    System.out.println("India Date-Time(dd/MM/yyyy)- " + dtf1.format(IndiaTime));
    
    // Get the target ZonedDateTime
    ZonedDateTime CaliforniaDateTime = IndiaTime.withZoneSameInstant(CaliforniaZone);
    System.out.println("California Date-time " + CaliforniaDateTime);
    // Formatting as per local datetime format
    DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a");
    System.out.println("California Date-Time(MM/dd/yyyy)- " + dtf2.format(CaliforniaDateTime));
  }
}

输出:

India Date-Time- 2019-10-20T10:30:45+05:30[Asia/Kolkata]
India Date-Time(dd/MM/yyyy)- 20/10/2019 10:30:45 AM
California Date-time 2019-10-19T22:00:45-07:00[America/Los_Angeles]
California Date-Time(MM/dd/yyyy)- 10/19/2019 10:00:45 PM

如我们所见,两个时区之间的时差为12:30小时。印度比美国加州洛杉矶早12小时30分钟。请注意,在这些类别中考虑了日光节约,没有观察到日光节约的月份相差11小时30分钟。

使用GregorianCalendar在不同时区之间转换日期和时间

如果使用的是GregorianCalendar calendar.setTime()方法,则将精确时间设置为来源。我们也可以在输出中看到它,其中calendar1.getTime()调用显示的时间与来源相同。
确保在使用SimpleDateFormat格式化时也设置了时区,该时区也将日期时间转换为设置的时区。

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

public class ConvertDate {
  public static void main(String[] args) {		
    // Creating GregorianCalendar with values
    GregorianCalendar calendar = new GregorianCalendar(2019, Calendar.OCTOBER, 20, 10, 30, 45);
    calendar.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
    System.out.println("India Date-Time- " + calendar.getTime());
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss a");
    // Formatting as per local datetime format
    System.out.println("India Date-Time(dd/MM/yyyy)- " + sdf.format(calendar.getTime()));
    
    GregorianCalendar calendar1 = new GregorianCalendar(TimeZone.getTimeZone("America/Los_Angeles"));
    calendar1.setTime(calendar.getTime());
    System.out.println("California Date-time " + calendar1.getTime());
    SimpleDateFormat sdf1 = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");  
    sdf1.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
    System.out.println("California Date-Time(MM/dd/yyyy)- " + sdf1.format(calendar1.getTime()));      
  }
}

输出:

India Date-Time- Sun Oct 20 10:30:45 IST 2019
India Date-Time(dd/MM/yyyy)- 20/10/2019 10:30:45 AM
California Date-time Sun Oct 20 10:30:45 IST 2019
California Date-Time(MM/dd/yyyy)- 10/19/2019 10:00:45 PM