2016-12-21 66 views
6

UTC + 14 ofseti ile 2016-12-21T07: 48: 36 bir tarih saat değerine sahibim. Datetime eşdeğer standart GMT zamanına nasıl dönüştürülür.UTC ofsetiyle bir Tarih saat değerini java'da GMT'ye dönüştürme 7

sampleDateFormat.parse() yöntemiyle denedim.Ama, UTZ ofset gibi TimeZone nesnesini alamıyorum.

sampleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC+14:00")) 

bana bir dize olarak orijinal tarihi olan üstlenecek

+0

Sorununuzun yalnızca desteklenmeyen "UTC + 14" ü kullanmanız olduğunu biliyorsunuz. getTimeZone sadece "GMT + xx" formunu bilir – Sxilderik

+0

** + 14 ** ofsetini nereden aldınız? –

cevap

2

Java 7. standart GMT zaman içine UTC datetime dönüştürmek için yardımcı olun. Aşağıdakileri yapın:

  • "GMT + 14"
  • dize değeri Ayrıştırma üzere saat dilimini bir SimpleDateFormat oluşturun ve ayarlayın. Sen
  • SimpleDateFormat için "UTC" saat dilimini ayarla bir Date nesneyi almak (veya farklı SimpleDateFormat örneğini kullanın) (siz de bir dize olarak bir sonuç istiyorsanız)

  • Biçim tarih Örnek:

    import java.text.DateFormat; 
    import java.text.SimpleDateFormat; 
    import java.util.Date; 
    import java.util.TimeZone; 
    
    public class ConvertToUTC { 
        public static void main(String[] args) throws Exception { 
    
         String dateval = "2016-12-21T07:48:36"; 
         DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
         df.setTimeZone(TimeZone.getTimeZone("GMT+14")); 
         Date date = df.parse(dateval); 
    
         System.out.println(df.format(date)); // GMT+14 
    
         df.setTimeZone(TimeZone.getTimeZone("UTC")); 
         System.out.println(df.format(date)); // UTC 
        } 
    } 
    
  • +0

    UTC + ofseti yerine GMT + ofsetini kullanırsak gün ışığı tasarrufu bileşeni göz önüne alınacak mı? – GOPI

    +0

    @GOPI Cevabı doğru. Sorunuz yalnızca sabit ofsetlerden bahseder (önek GMT veya UTC ise eşittir). Yani gün ışığı tasarrufu, sorunuzun bağlamında alakasız.Aksi halde, sabit ofsetleri değil, "Asia/Tokyo" vb. Saat dilimi tanımlayıcılarını kullanmayın. –

    +0

    Teşekkürler Meno & Grodriguez! – GOPI

    2

    kullanımı "GMT + 14: 00" yerine "UTC + 14: 00"

    SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss"); 
    f.setTimeZone(TimeZone.getTimeZone("GMT+14:00")); 
    final Date d = f.parse("2016-12-21T07:48:36"); 
    f.setTimeZone(TimeZone.getTimeZone("UTC")); 
    System.out.println(f.format(d)); // -> 2016-12-20T05:48:36 
    
    2

    tl; dr

    LocalDateTime.parse("2016-12-21T07:48:36")  // Parse as a `LocalDateTime` given the lack of an offset or zone. *Not* an actual moment, only a rough approximation of potential moments along a range of about 26-27 hours. 
          .atOffset(ZoneOffset.ofHours(14)) // Assign an offset-from-UTC as context, giving meaning to determine an actual point on the timeline. 
          .toInstant()       // Renders `Instant` object in UTC. 
    

    java.time

    modern bir yoldur sonra Java 8 ve yerleşik java.time sınıflar ile olduğunu. İşlevlerin çoğu, ThreeTen-Backport projesinde Java 6 & 7'ye geri yüklendi. o ofset veya bölge hakkında herhangi bir bilgi yoksun olarak

    ZoneOffset offset = ZoneOffset.ofHours(14); // fourteen hours ahead of UTC. 
    

    bir LocalDateTime olarak dizgesini çözümler. Girişiniz standart ISO 8601 biçiminde olduğundan, bir biçimlendirme deseni belirtmenize gerek yoktur.

    LocalDateTime ldt = LocalDateTime.parse("2016-12-21T07:48:36"); 
    

    bir OffsetDateTime bir nesne almak için yerel tarih-zaman ofset uygulayın. Bu itibaren

    OffsetDateTime odt = ldt.atOffset(offset); 
    

    , UTC daima bir Instant ayıklamak.

    Instant instant = odt.toInstant(); 
    

    instant.toString(): 2016-12-20T17: 48: 36Z UTC olarak

    , değer farklı bir tarih, yerine 21 20. olup.

    Bkz. live code at IdeOne.com.


    Hakkında java.time

    java.time çerçeve daha sonra Java 8 ve yerleşiktir. Bu sınıflar, java.util.Date, Calendar, & SimpleDateFormat gibi zahmetli eski legacy tarih-saat sınıflarını tamamlar.

    Joda-Time projesinin şimdi maintenance mode projesinde, java.time sınıflarına geçişi önerir.

    Daha fazla bilgi için, bkz. Oracle Tutorial. Ve birçok örnek ve açıklamalar için Stack Overflow'u arayın. Şartname JSR 310. Bir JDBC driver uyumlu JDBC 4.2 ile veya daha sonra kullanmak

    , kendi veritabanı ile nesnelerin doğrudan java.time değiştirebilir. Dizelere ve java.sql. * Sınıflarına gerek yoktur.

    java.time sınıflarını nereden edinebilirim?

    • Java SE 8, Java SE 9 ve daha sonra
      • Dahili.
      • Paketlenmiş bir uygulama ile standart Java API'nin bir parçası.
      • Java 9, bazı küçük özellikler ve düzeltmeler ekler.
    • Java SE 6 ve java.time işlevlerinin büyük bir kısmına
    • Android

    ThreeTen-Extra proje ilave sınıfları ile java.time uzanır. Bu proje java.time için gelecekteki olası eklemeler için kanıtlanmış bir zemin. Burada Interval, YearWeek, YearQuarter ve more gibi bazı yararlı sınıflar bulabilirsiniz.

    +0

    Teknik olarak bir "Anında", herhangi bir zaman dilimi içinde "içinde" değildir. Bu çağdan bir ofset temsil eder. – OrangeDog

    +2

    @OrangeDog Yanlış. Bir 'Anında' kesinlikle UTC’de. Sınıf dokümanı alıntılamak için: “Epoch saniye, 1970-01-01T00: 00: 00Z standart Java döneminden ölçülür”. Bu Z' Zulu için kısa ve UTC anlamına gelir. UTC olarak tanımlanmadığında, bir "Anında" hiçbir anlamı olmazdı. –

    +0

    Sadece dokümanlardaki zamanın temsili Z olduğu için, bir 'Anında'nın' olduğu anlamına gelmez. Sınıf dokümanı alıntılamak için: "bu Java API'si kendi zaman ölçeğini, Java Zaman Ölçeğini tanımlar". – OrangeDog