Mam milisekundy w pewnym pliku dziennika wygenerowanym na serwerze, znam również lokalizację, z której został wygenerowany plik dziennika, moim problemem jest konwersja milisekund do daty w określonym formacie. Przetwarzanie tego dziennika odbywa się na serwerze znajdującym się w innej strefie czasowej. Podczas konwersji do formatu „SimpleDateFormat” program pobiera datę maszyny, ponieważ taka sformatowana data nie reprezentuje prawidłowego czasu serwera. Czy jest jakiś sposób, aby poradzić sobie z tym elegancko?
long yourmilliseconds = 1322018752992l;
//1322018752992-Nov 22, 2011 9:25:52 PM
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS",Locale.US);
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(yourmilliseconds);
System.out.println("GregorianCalendar -"+sdf.format(calendar.getTime()));
DateTime jodaTime = new DateTime(yourmilliseconds,
DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss,SSS");
System.out.println("jodaTime "+parser1.print(jodaTime));
Wynik:
Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992
GregorianCalendar
,SimpleDateFormat
etc.) oraz doskonałe biblioteki Joda-Time są obecnie wypierane przez nowoczesne java.time klas.Odpowiedzi:
źródło
final Calendar calendar = Calendar.getInstance();
1515436200000l
bo dostaję sięcalendar.get(Calendar.MONTH))
jak0
!java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .Możesz użyć
java.util.Date
class, a następnie użyćSimpleDateFormat
do sformatowania plikuDate
.Możemy wykorzystać pakiet java.time (tutorial) - API DateTime wprowadzone w Javie SE 8.
// Format the date
źródło
java.util.Date
są amortyzowane. (W JDK8 są ulepszone API daty i czasujava.time
)java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .tl; dr
Detale
Inne odpowiedzi używają przestarzałych lub niepoprawnych klas.
Unikaj starych klas daty i godziny, takich jak java.util.Date/.Calendar. Okazały się źle zaprojektowane, zagmatwane i kłopotliwe.
java.time
Java.time ramy przychodzi wbudowany w Java 8 i późniejszych. Wiele funkcji zostało przeniesionych do Java 6 i 7 i dodatkowo dostosowanych do systemu Android . Wykonane przez tych samych ludzi, którzy stworzyli Joda-Time .
Jest
Instant
moment na osi czasu w UTC z rozdzielczością nanosekund . Jego epoka to pierwszy moment 1970 roku w UTC.Zakładając, że dane wejściowe są liczbą milisekund od 1970-01-01T00: 00: 00Z (nie jest jasne w pytaniu), możemy łatwo utworzyć instancję
Instant
.W
Z
tym standardzie ciąg w formacie ISO 8601 jest skrótem odZulu
i oznacza UTC .Zastosuj strefę czasową, używając odpowiedniej nazwy strefy czasowej , aby uzyskać
ZonedDateTime
.Zobacz, jak działa ten kod na IdeOne.com .
Asia/Kolkata
strefa czasowa ?Domyślam się, że strefa czasowa Indii wpływa na Twój kod. Widzimy tutaj, że dostosowanie do
Asia/Kolkata
strefy czasowej powoduje renderowanie tej samej pory dnia, co zgłaszasz,08:55
czyli pięć i pół godziny przed naszą wartością UTC03:25
.Strefa domyślna
Możesz zastosować bieżącą domyślną strefę czasową maszyny JVM. Pamiętaj, że wartość domyślna może się zmienić w dowolnym momencie podczas działania . Dowolny kod w dowolnym wątku dowolnej aplikacji w JVM może zmienić bieżącą wartość domyślną. Jeśli to ważne, zapytaj użytkownika o żądaną / oczekiwaną strefę czasową.
Informacje o java.time
Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak
java.util.Date
,Calendar
, iSimpleDateFormat
.Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Korzystając ze sterownika JDBC zgodnego z JDBC 4.2 lub nowszym, możesz wymieniać obiekty java.time bezpośrednio z bazą danych. Nie ma potrzeby używania ciągów znaków ani klas java.sql. *.
Skąd wziąć klasy java.time?
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak
Interval
,YearWeek
,YearQuarter
, i więcej .źródło
ZoneId.systemDefault()
. Zobacz nową sekcję dodaną na końcu mojej odpowiedzi.Najłatwiej to zrobić, używając klasy Joda DateTime i określając zarówno znacznik czasu w milisekundach, jak i żądaną strefę DateTimeZone.
Zdecydowanie zalecam unikanie wbudowanych klas Java Date i Calendar; są okropne.
źródło
Jeśli wartość milis jest liczbą milis od 1 stycznia 1970 GMT, co jest standardem dla maszyny JVM, to jest to niezależne od strefy czasowej. Jeśli chcesz sformatować go przy użyciu określonej strefy czasowej, możesz po prostu przekonwertować go na obiekt GregorianCalendar i ustawić strefę czasową. Następnie istnieje wiele sposobów na sformatowanie go.
źródło
Moje rozwiązanie
źródło
Robię to tak:
Możesz również użyć
getDateInstance(int style)
następujących parametrów:DateFormat.SHORT
DateFormat.MEDIUM
DateFormat.LONG
DateFormat.FULL
DateFormat.DEFAULT
źródło
Klasa SimpleDateFormat zawiera metodę o nazwie SetTimeZone (TimeZone), która jest dziedziczona z klasy DateFormat. http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html
źródło
Najprostszy sposób:
źródło
Poniżej znajduje się moje rozwiązanie, aby uzyskać datę z milisekund do formatu daty. Aby uruchomić ten kod, musisz użyć Joda Library .
źródło
Możesz spróbować java.time api;
źródło