SORU
27 Temmuz 2011, ÇARŞAMBA


Neden bu iki kez (1927) garip bir sonuç verir çıkarıyor muyuz?

Eğer bir saniye arayla iki kez başvuru tarih dizeleri ayrıştırma ve onları karşılaştıran aşağıdaki programı çalıştırın:

public static void main(String[] args) throws ParseException {
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    String str3 = "1927-12-31 23:54:07";  
    String str4 = "1927-12-31 23:54:08";  
    Date sDt3 = sf.parse(str3);  
    Date sDt4 = sf.parse(str4);  
    long ld3 = sDt3.getTime() /1000;  
    long ld4 = sDt4.getTime() /1000;
    System.out.println(ld4-ld3);
}

Çıktı

353

Neden ld4-ld3 1 kez bir saniyelik fark beklediğiniz gibi, ancak 353 değil mi?

Eğer kez tarihleri bir saniye sonra değiştirirsem:

String str3 = "1927-12-31 23:54:08";  
String str4 = "1927-12-31 23:54:09";  

ld4-ld3 1 olacak.


Sürüm Java:

java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Dynamic Code Evolution Client VM (build 0.2-b02-internal, 19.0-b04-internal, mixed mode)

Saat (**15):

sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
offset=28800000,dstSavings=0,
useDaylight=false,
transitions=19,
lastRule=null]

Locale(Locale.getDefault()): zh_CN

CEVAP
27 Temmuz 2011, ÇARŞAMBA


Şanghay'da 31 Aralık ' ta saat dilimi bir değişiklik oldu.

Şanghay'da 1927 ayrıntılar için this page bkz. Saati 5 dakika geri gitti 1927, son 52 saniye gece temelde. "1927-12-31 23:54:08" aslında iki kez oldu, ve Java gibi . ayrıştırma gibi görünüyor ^em>daha sonrayerel tarih için olası anlık zaman - dolayısıyla fark/.

Saat dilimleri genellikle garip ve harika bir dünya içinde sadece bir bölüm.

DÜZENLEME:Dur tuşuna basın! Tarih değişiklikleri...

Asıl soruya artık TZDB sürüm 2013a ile yeniden tam olarak aynı davranışı göstermektedir. 2013a, sonuç olarak 358 olurdu saniye, 23:54:03 süre ile bir geçiş yerine, 23:54:08.

Ben sadece fark bu çünkü ben toplama gibi sorular bu Noda Zaman, şeklinde unit tests... test şimdi değişti, ama sadece gider göstermek bile ulaş güvenli.

DÜZENLEME:Tarih yine değişti...

İçinde TZDB 2014f zaman değişim vardır taşındı 1900-12-31, ve şimdi sadece 343 ikinci değişiklik (yani saat arası t t 1 344 saniye, eğer ne demek istediğimi anladınız).

DÜZENLEME:1900... ... bir geçişi Ken Kin's question cevaplamak için Java saat uygulaması davranır gibi görünüyortümsadece 1900 UTC başlamadan önce: herhangi bir an için standart zaman olarak saat dilimleri

import java.util.TimeZone;

public class Test {
    public static void main(String[] args) throws Exception {
        long startOf1900Utc = -2208988800000L;
        for (String id : TimeZone.getAvailableIDs()) {
            TimeZone zone = TimeZone.getTimeZone(id);
            if (zone.getRawOffset() != zone.getOffset(startOf1900Utc - 1)) {
                System.out.println(id);
            }
        }
    }
}

Yukarıdaki kod benim Windows çıktı makine üretir. Herhangi bir standart, daha 1900 başında ofset olan herhangi bir zaman dilimi bir geçiş olarak sayar. TZDB kendisi bazı verileri geri'den önceki ve yok güvenmek, bir fikrin bir "sabit" standart zaman (ne getRawOffset varsayar için geçerli bir kavram) o yüzden diğer kütüphaneler gerekmez tanıtmak bu yapay geçiş.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Abe Olandres

    Abe Olandres

    16 EYLÜL 2006
  • Ryan Billy

    Ryan Billy

    30 EKİM 2006
  • Yo Mama

    Yo Mama

    18 EYLÜL 2005