2013-08-26 19 views
7

Piszę program, który musi określić czas ostatniej modyfikacji plików/katalogów. Chcę obsłużyć ten czas za pomocą Joda Time i używam Java 7 NIO.2 klasa Files, aby uzyskać czas ostatniej modyfikacji pliku. Jego getLastModifiedTime() metoda zwraca instancję FileTime klasy, która ma wygodną metodę toMillis(), którego wynik mijam do Joda czasu DateTime konstruktora klasy:Java 7 NIO.2 Files.getLastModifiedTime strefa czasowa

new DateTime(Files.getLastModifiedTime(path).toMillis()); 

Mam jednak wrażenie, że robię to źle, ponieważ DateTime(long) konstruktor wyraźnie wspomina, że ​​instancja DateTime zostanie utworzona z domyślną strefą czasową. FileTime Dokumenty jednak nie wymieniają swojej strefy czasowej w dowolnym miejscu. Przejrzałem kod FileTime; wydaje się być bardzo prosty, a jego metoda toString() sugeruje, że używa strefy czasowej UTC (tworzy ona Calendar w strefie czasowej UTC i ustawia jej milisekundy bezpośrednio).

Czy zatem FileTime używa czasu UTC lub czasu lokalnego? Jaki jest prawidłowy sposób konwersji FileTime na DateTime?

Odpowiedz

5

Znacznik czasu Java milisekundy to znacznik czasu UTC. To właśnie zwraca FileTime.toMillis() i czego oczekuje konstruktor DateTime. To samo dotyczy innych metod Java API; na przykład metoda System.currentTimeMillis(), konstruktor i tak dalej.

Wszystkie działają tak samo. Rzeczywiście, podobnie jak inne metody bibliotek Unix/Linux/OSX w innych językach programowania.

Jedyny przypadek, w którym się to łamie, to sytuacja, w której ktoś nieprawidłowo konfiguruje/ustawia zegar systemowy.

+0

Dziękuję, teraz rozumiem. Z jakiegoś powodu myślałem, że konstruktor 'DateTime' oczekuje znacznika czasu w lokalnej strefie czasowej, ale, jak powiedziałeś, znacznik czasu jest zawsze w UTC. Następnie argument 'DateTimeZone' w innym konstruktorze' DateTime' określa tylko sposób wyświetlania tego znacznika czasu. –

1

Funkcja FileTime.toMillis() mówi, że zwraca wartość w milisekundach, począwszy od epoki (1970-01-01T00: 00: 00Z). new DateTime (millis) tworzy instancję DateTime, która przechowuje czas w milisekundach od epoki Java z 1970-01-01T00: 00: 00Z i Chronology w domyślnej strefie czasowej, która określa, w jaki sposób wartość milisekundy jest konwertowana na pola daty.

Powiązane problemy