วิธีแปลง DateTime DateTime เป็น UTC Date ใน JAVA [ซ้ำ]
ฉันต้องใช้วันที่และเวลาที่ฉันได้รับจากผู้ใช้และแปลงเวลานั้นเป็น UTC จากเวลาที่กำหนด ตอนนี้โซลูชันทั้งหมดใช้งานได้ แต่ไม่เป็นไปตามที่ฉันต้องการ ขั้นแรกมันจะแปลงเป็นเขตเวลา แต่ฉันไม่ต้องการแปลงในตอนแรก ฉันต้องตั้งค่าเขตเวลานั้นในวันที่ของฉันแล้วแปลงเวลานั้นเป็น UTC ตอนนี้แต่ละวิธีแก้ปัญหาแสดงว่าฉันต้องผ่านวันที่และเวลาจากนั้นฉันได้รับการอัปเดตวันที่และเวลาพร้อมกับเขตเวลาที่ฉันระบุจากนั้นแปลงเป็น UTC นี่ไม่ใช่คำถามของฉัน
ผู้ใช้ของฉันจะส่งวันที่เวลาของเขตเวลาใด ๆ ให้ฉันและเซิร์ฟเวอร์ของฉันจะทำงานในเขตเวลา UTC ฉันจะได้รับรหัสโซนจากส่วนหน้า ฉันต้องการแปลงเวลาวันที่นั้นเป็น UTC และตรวจสอบเงื่อนไขอื่น ๆ ของฉัน อาจเป็นไปได้ที่ฉันจะได้รับเวลา UTC-7 ในหนึ่งคำขอจากนั้นในคำขอถัดไปฉันจะได้รับ UTC + 5: 30 ดังนั้นเวลาทั้งหมดควรถูกแปลงเป็น UTC และฉันไม่สามารถกำหนดเขตเวลาในวันที่ได้
ฉันต้องการกำหนดเขตเวลาที่เจาะจงเป็นวันที่และฉันได้รับวันที่และเวลาของเขตเวลานั้น แต่ฉันไม่สามารถกำหนดเขตเวลาที่แน่นอนได้ ฉันกำลังเพิ่มรหัสของฉันโปรดบอกฉันว่าฉันผิดตรงไหน:
Calendar laCalendar = Calendar.getInstance();
laCalendar.set(2020, 8, 14, 00, 00);
Date losAngelesDate = laCalendar.getTime();
System.out.println("LA Date1===>" + losAngelesDate);
SimpleDateFormat simpleTimeFormatForUSA = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
simpleTimeFormatForUSA.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
String americaDateString = simpleTimeFormatForUSA.format(laCalendar.getTime());
SimpleDateFormat dateFormatUSA = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
losAngelesDate = dateFormatUSA.parse(americaDateString);
System.out.println("LA Date2===>" + losAngelesDate);
Date utcDate = losAngelesDate;
Calendar calendar = Calendar.getInstance();
calendar.setTime(utcDate);
TimeZone timeZone = TimeZone.getTimeZone("UTC");
SimpleDateFormat simpleTimeFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
simpleTimeFormat.setTimeZone(timeZone);
String utcTime = simpleTimeFormat.format(calendar.getTime());
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
utcDate = dateFormat.parse(utcTime);
System.out.println("UTC date====>" + utcDate);
และผลลัพธ์ของฉันคือ
LA Date1===>Mon Sep 14 00:00:56 UTC 2020
LA Date2===>Sun Sep 13 17:00:00 UTC 2020
UTC date====>Sun Sep 13 17:00:00 UTC 2020
ที่นี่คุณจะเห็นว่า DateTime ของฉันถูกแปลงแล้ว แต่เขตเวลายังคงเป็น UTC และฉันต้องการอัปเดต
คำตอบ
นี่คือวิธีที่ฉันจะเขียนโดยใช้ Java 8 Date / Time APIs
public static void main(String[] args)
{
System.out.println("UTC");
toTimeZone(new Date(), TimeZone.getTimeZone(ZoneId.of("UTC")));
System.out.println("America/Los_Angeles");
toTimeZone(new Date(), TimeZone.getTimeZone(ZoneId.of("America/Los_Angeles")));
}
public static void toTimeZone(Date date, TimeZone timeZone)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
Instant epochMillisInstant = Instant.ofEpochMilli(calendar.getTimeInMillis());
LocalDateTime localDateTime = LocalDateTime.ofInstant(epochMillisInstant, ZoneId.systemDefault());
ZonedDateTime dateTimeToConvert = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
ZonedDateTime dateTimeWithTimeZone = dateTimeToConvert.withZoneSameInstant(timeZone.toZoneId());
String formattedDateForNewTimeZone = dateTimeWithTimeZone.format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a"));
System.out.println(formattedDateForNewTimeZone);
}
ใช้ Just Java 8 Date / Time APIs - เวอร์ชันที่สั้นกว่า
public static void main(String[] args) {
System.out.println("UTC");
toTimeZone(LocalDateTime.now(),"UTC");
System.out.println("America/Los_Angeles");
toTimeZone(LocalDateTime.now(),"America/Los_Angeles");
}
private static void toTimeZone(LocalDateTime localDateTime, String timeZone) {
ZonedDateTime localDateTimeToConvert = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
ZonedDateTime zonedDateTime = localDateTimeToConvert.withZoneSameInstant(ZoneId.of(timeZone));
String formattedDateForNewTimeZone = zonedDateTime.format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a"));
System.out.println(formattedDateForNewTimeZone);
}
ก่อนที่คุณจะแปลงปฏิทินเป็นวันที่ให้ตั้งค่าเขตเวลาตามความต้องการของคุณ
ตัวอย่างเช่น:
import java.util.Calendar;
import java.util.TimeZone;
public class Timezone{
public static void main(String []args){
Calendar laCalendar = Calendar.getInstance();
TimeZone timezone = TimeZone.getTimeZone("UTC");
laCalendar.set(2020, 8, 14, 00, 00);
laCalendar.setTimeZone(timezone);
java.util.Date losAngelesDate = laCalendar.getTime();
System.out.println(losAngelesDate.toString());
}
}