Yaz saati uygulaması ve tzupdater ile java güncellemesi yapılması

Yaz saati uygulaması ve tzupdater ile java güncellemesi yapılması

10 Ekim 2016 0 Yazar: Cem Kefeli

Yaz saati uygulaması Türkiye’de 1972 yılından 2016 yılına kadar doğrudan enerji tasarrufu amaçlı olarak gün ışığından daha fazla faydalanabilmek amacıyla uygulanmıştır. Bu uygulama ile birlikte ilkbahar aylarının başlangıcında saatler bir saat ileri alınır ve Türkiye saati UTC+3 olur. Sonbahar aylarının sonuna doğru ise saatler bir saat geri alınarak ülke zaman dilimi UTC+2’ye geri döner ve yaz saati uygulaması ise son bulmuş olur. Yani aslında Türkiye’nin gerçek zaman dilimi UTC+2 olarak belirlenmiştir. UTC+3 ise yaz saati uygulaması için geçici bir süreliğine geçilen bir zaman dilimidir.

2016 ekim ayı itibari ile ise Bakanlar Kurulu’nun 2013’de almış olduğu ama 2016’ya kadar uygulanmayan karar (Resmi gazete 2016/9154) doğrultusunda saatlerin geri alınması uygulamasına son verilmiştir. Yani artık tüm yıl boyunca yaz saati uygulanmasının kullanılması ya da kış saati uygulamasının ülke genelinde son bulması kararlaştırılmıştır.

Özellikle bankacılık ve iletişim sektörü için bu durumdan nasıl etkilenileceği, olumsuz etkilerinin neler olacağının tartışıldığı bir ortamda bilişim sistemleri de kendisini yeni karara adapte etmeye çalışıyor. Binlerce ve hatta çok büyük olasılıkla on binlerce sistem bu karar için elden geçiriliyor… İşletim sistemlerine yamalar yükleniyor, veritabanlarına yamalar yükleniyor, vb… Bu bağlamda kurumsal birçok yazılımın vazgeçilmezi olan Java için de yeni koşullara ayak uydurabilmenin bazı şartları bulunuyor.

iana.org üzerinden indirebileceğiniz bir time zone (tz) güncellemesi ile Java kurulumunuzu Türkiye için yeni time zone’a uygun hale getirebilirsiniz. Aşağıda yüklemenin nasıl yapılacağını göstermeye çalışacağım fakat bununla birlikte bu güncellemenin etkilerinin de neler olacağını görebilmek, analiz edebilmek için birkaç satırdan oluşan bir test kodu yazdım ve yaşadıklarımı aşağıdaki gibi aktarmaya çalışıyorum;

Java test kodumuz aşağıdaki gibi;

Time Zone test uygulaması

package datetimeapp;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;

/**
 *
 * @author cem.kefeli
 */
public class DatetimeApp {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyy HH:mm:ss.SSS");
        
        ZonedDateTime zonedDateTime_Local = ZonedDateTime.now();
        Date dateTime_ZonedLocal = Date.from(zonedDateTime_Local.toInstant());        
        System.out.println("dateTime_ZonedLocal: "+simpleDateFormat.format(dateTime_ZonedLocal));
        
        ZoneId zoneId_Turkey = ZoneId.of("Europe/Istanbul"); // Europe/Istanbul +02:00/+03:00
        ZonedDateTime zonedDateTime_Turkey = ZonedDateTime.of(LocalDateTime.now(), zoneId_Turkey);
        Date dateTime_ZonedTurkey = Date.from(zonedDateTime_Turkey.toInstant());        
        System.out.println("dateTime_ZonedTurkey: "+simpleDateFormat.format(dateTime_ZonedTurkey));
        
        ZoneId zoneId_Any = ZoneId.of("Asia/Baku"); // Asia/Baku +04:00
        ZonedDateTime zonedDateTime_Any = ZonedDateTime.of(LocalDateTime.now(), zoneId_Any);
        Date dateTime_ZonedAny = Date.from(zonedDateTime_Any.toInstant());        
        System.out.println("dateTime_ZonedAny: "+simpleDateFormat.format(dateTime_ZonedAny));
    }
}

Eğer bu kodu derleyerek çalıştıracak olursanız aşağıdaki gibi bir çıktı ile karşılaşıyor olacaksınız. Şu anda yaz saati modunda ve UTC+3 zaman diliminde olduğumuz için Bakü yerel zaman dilimi ile aramızdaki zaman farkı bir saat olarak görülecektir. Sistem zamanı ve java zamanı ise aynı görülüyor.

UTC+3 için time zone test uygulamasının çıktıları

[root@localhost datetimeApp]# date
Mon Oct 10 15:45:59 EEST 2016
[root@localhost datetimeApp]# /root/Desktop/datetimeApp/jdk1.8.0_101/bin/java -jar datetimeApp.jar
dateTime_ZonedLocal: 10.10.2016 15:46:00.820
dateTime_ZonedTurkey: 10.10.2016 15:46:00.822
dateTime_ZonedAny: 10.10.2016 14:46:00.824
[root@localhost datetimeApp]#

Sistem zamanını bir ay ileri alacak yani 10 Kasım yapacak olursanız ise işler biraz değişecek. Denk geldi ama 78 sene önce de bu tarihte büyük bir değişiklik yaşamıştık. Yeri gelmişken büyük lider Mustafa Kemal Atatürk‘ü anmadan geçemeyeceğim. Nutuk‘u her 10 kasımda bir kez daha okumanızı tavsiye ederim. Konuya geri dönecek olursak yaz saati uygulaması kasım ayında bitmiş olduğu için sistem otomatik olarak zaman dilimini UTC+2’ye çekecektir. Bu durum ise bu sene uygulanmaya başlayan karara uygun olmayan bir durum oluşmasına neden oalcaktır. Bakü ile aramızdaki saat farkı ise iki saate çıkacaktır. Aşağıda bu durum için çıktıları görebilirsiniz;

UTC+2 için time zone test uygulamasının çıktıları

[root@localhost datetimeApp]# date
Thu Nov 10 14:47:15 EET 2016
[root@localhost datetimeApp]# /root/Desktop/datetimeApp/jdk1.8.0_101/bin/java -jar datetimeApp.jar
dateTime_ZonedLocal: 10.11.2016 14:47:17.162
dateTime_ZonedTurkey: 10.11.2016 14:47:17.179
dateTime_ZonedAny: 10.11.2016 12:47:17.180
[root@localhost datetimeApp]# 

Java timezone güncellemesini aşağıdaki gibi yaptığımızda ise bu durumun ortadan kalktığını ve sistem saati yanlış bir zamanı gösterse bile java saatinin olması gereken zamanı gösterdiğini görebiliriz;

Java tz güncellemesi öncesi versiyon kontrolü

[root@localhost datetimeApp]# /root/Desktop/datetimeApp/jdk1.8.0_101/bin/java -jar /root/Desktop/datetimeApp/tzupdater/tzupdater-2.1.0.jar -V
tzupdater version 2.1.0-b04
JRE tzdata version: tzdata2016d
[root@localhost datetimeApp]#

Java tz güncellemesi

[root@localhost datetimeApp]# /root/Desktop/datetimeApp/jdk1.8.0_101/bin/java -jar /root/Desktop/datetimeApp/tzupdater/tzupdater-2.1.0.jar -l file:///root/Desktop/datetimeApp/tzupdater/tzdata2016g.tar.gz  -v
Using file:///root/Desktop/datetimeApp/tzupdater/tzdata2016g.tar.gz as source for tzdata bundle.
java.home: /root/Desktop/datetimeApp/jdk1.8.0_101/jre
java.vendor: Oracle Corporation
java.version: 1.8.0_101
tzupdater version 2.1.0-b04
JRE tzdata version: tzdata2016d
Downloaded file to /tmp/tz.tmp/tzdata.tar.gz
.
.
.
Outputting tzdb file: /root/Desktop/datetimeApp/jdk1.8.0_101/jre/lib/tzdb.dat.dynamic
tzupdater tool would update with tzdata version: tzdata2016g
Downloaded file to /tmp/tz.tmp/sha512hash
Renaming /root/Desktop/datetimeApp/jdk1.8.0_101/jre/lib/tzdb.dat to /root/Desktop/datetimeApp/jdk1.8.0_101/jre/lib/tzdb.dat.tzdata2016d
Renaming /root/Desktop/datetimeApp/jdk1.8.0_101/jre/lib/tzdb.dat.dynamic to /root/Desktop/datetimeApp/jdk1.8.0_101/jre/lib/tzdb.dat
Validating for : tzdata2016g
Validation complete
JRE updated to version : tzdata2016g
[root@localhost datetimeApp]#

Java tz güncellemesi sonrası versiyon kontrolü

[root@localhost datetimeApp]# /root/Desktop/datetimeApp/jdk1.8.0_101/bin/java -jar /root/Desktop/datetimeApp/tzupdater/tzupdater-2.1.0.jar -V
tzupdater version 2.1.0-b04
JRE tzdata version: tzdata2016g
[root@localhost datetimeApp]#

Aşağıdaki çıktıya bakacak olursanız sistem zamanı yaz saati uygulamasını bitirip UTC+2’ye geri dönmüş olsa bile java zamanı yaz saati uygulamasını devam ettirmekte ve zaman dilimini UTC+3’de tutmaktadır. Java zamanının bu değeri göstermesinin nedeni ise yapılan java tz güncellemesidir.

Java güncellemesi sonrası test uygulamasının çıktıları

[root@localhost datetimeApp]# date
Thu Nov 10 14:51:40 EET 2016
[root@localhost datetimeApp]# /root/Desktop/datetimeApp/jdk1.8.0_101/bin/java -jar datetimeApp.jar
dateTime_ZonedLocal: 10.11.2016 15:51:42.283
dateTime_ZonedTurkey: 10.11.2016 15:51:42.285
dateTime_ZonedAny: 10.11.2016 14:51:42.286
[root@localhost datetimeApp]# 

Java için durum bu şekilde ama konu bir de JVM üzerinde hayatını devam ettiren uygulamaya gelecek olursa burada karşımıza uygulamanın niteliği ile ilgili özellikler çıkıyor olacak. Yani yaz saati uygulamasının devam ettirilmesi aşamasında bir uygulamanın sağlıklı çalışabilmesi için mutlaka bu java tz güncellmesi yapılması gerekiyor gibi genel kabul görmüş bir kanı bulunmuyor. Uygulamanın zaman bilgisini nereden aldığı, zaman bilgisini kullanıp kullanmadığı gibi uygulama özelindeki durumların araştırılması gerekiyor.