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