วิธีแปลง DateTime DateTime เป็น UTC Date ใน JAVA [ซ้ำ]

Sep 14 2020

ฉันต้องใช้วันที่และเวลาที่ฉันได้รับจากผู้ใช้และแปลงเวลานั้นเป็น 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 และฉันต้องการอัปเดต

คำตอบ

1 SanketParikh Sep 14 2020 at 17:00

นี่คือวิธีที่ฉันจะเขียนโดยใช้ 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);
    }
Spectric Sep 14 2020 at 16:55

ก่อนที่คุณจะแปลงปฏิทินเป็นวันที่ให้ตั้งค่าเขตเวลาตามความต้องการของคุณ

ตัวอย่างเช่น:

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());
    }
}