JAVA'da herhangi bir TimeZone dateTime'ı UTC Date'e dönüştürme [duplicate]

Sep 14 2020

Kullanıcı tarafından aldığım tarih saatini kullanmalı ve bu saati verilen zamandan UTC'ye çevirmeliyim. Şu anda tüm çözümler işe yarıyor, ancak benim ihtiyaç duyduğum gibi değil. Birincisi, saat dilimine dönüşüyor, ancak başlangıçta dönüştürmek istemiyorum. Bu saat dilimini tarihime göre ayarlamalı ve sonra bu saati UTC'ye çevirmeliyim. Şu anda, her bir çözüm tarih ve saati geçirmem gerektiğini gösteriyor ve ardından sağladığım saat dilimiyle tarih ve saati güncelliyor ve ardından UTC'ye dönüştürüyorum. Bu benim sorum değildi.

Kullanıcım bana herhangi bir saat diliminin tarih saatini gönderecek ve sunucum UTC saat diliminde çalışıyor olacak. Bölge kimliğini ön uçtan alacağım. Bu tarih saatini UTC'ye dönüştürmek ve diğer koşullarımla doğrulamak istiyorum. Bir talepte UTC-7 saatini almam mümkün olabilir ve daha sonra bir sonraki talepte UTC + 5: 30 alacağım. Bu nedenle, tüm saatler UTC'ye dönüştürülmeli ve tarihe saat dilimini ayarlayamıyorum.

Belirli bir saat dilimini bugüne kadar ayarlamak istedim ve bu saat diliminin tarihini ve saatini alıyorum, ancak tam saat dilimini ayarlayamıyorum. Burada kodumu ekliyorum, lütfen bana nerede yanıldığımı söyleyin:

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

Ve çıktım

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

Burada DateTime'ımın dönüştürüldüğünü görebilirsiniz, ancak saat dilimi hala UTC ve bunu güncellemek istedim.

Yanıtlar

1 SanketParikh Sep 14 2020 at 17:00

İşte Java 8 Tarih / Saat API'lerini kullanarak nasıl yazacağım.

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

Yalnızca Java 8 Tarih / Saat API'lerini Kullanma - Daha Kısa Sürüm

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

Takvimi Tarihe dönüştürmeden önce, Saat Dilimini tercihinize göre ayarlayın.

Örneğin:

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