Mam sekund od 1 stycznia 1 UTC (czas Epoki).Konwersja Epoki sekund do daty i formatu czasu w Javie
1320105600
Muszę przekonwertować te sekundy na datę i godzinę w poniższym formacie.
Friday,November 4,2011 5:00,AM
Jak mogę to osiągnąć?
Mam sekund od 1 stycznia 1 UTC (czas Epoki).Konwersja Epoki sekund do daty i formatu czasu w Javie
1320105600
Muszę przekonwertować te sekundy na datę i godzinę w poniższym formacie.
Friday,November 4,2011 5:00,AM
Jak mogę to osiągnąć?
Sztuką jest użycie java.util.Date
i java.text.DateFormat
, aby uzyskać żądany format. Możesz sprawdzić, jak to zrobić w tutorials on the Web.
long yourSeconds = 1320105600L;
Date d = new Date(yourSeconds * 1000);
Tutaj javadoc to opis. Konstruktor potrzebuje milisekund.
Aby wyświetlić tę datę w odpowiednim formacie należy sprawdzić DataFormat
Oto przykład:
DateFormat df = new SimpleDateFormat("dd MMM yyyy hh:mm:ss zzz");
System.out.println(df.format(date));
W przypadku jesteś ograniczony do spuścizny java.util.Date
i java.util.Calendar
API, trzeba wziąć pod uwagę że znaczniki czasu są interpretowane w milisekundach, a nie w sekundach. Najpierw należy pomnożyć go przez 1000, aby uzyskać znacznik czasu w milisekundach.
long seconds = 1320105600;
long millis = seconds * 1000;
W ten sposób można go podać do a.o. konstruktorem java.util.Date
i ostatecznie użyć SimpleDateFormat
do konwersji na java.lang.String
w pożądany wzór formatu daty, jeśli to konieczne, z wcześniej zdefiniowaną strefą czasową (w przeciwnym razie użyłby systemu default time zone, który nie jest GMT/UTC per se, a zatem sformatowany czas może być wyłączony).
Date date = new Date(millis);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE,MMMM d,yyyy h:mm,a", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String formattedDate = sdf.format(date);
System.out.println(formattedDate); // Tuesday,November 1,2011 12:00,AM
W przypadku, jesteś już na Java8, tam LocalDateTime#ofEpochSecond()
który pozwala karmić epoka sekund bezpośrednio bez konieczności mnożenia do milisekund smaku.
LocalDateTime dateTime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE,MMMM d,yyyy h:mm,a", Locale.ENGLISH);
String formattedDate = dateTime.format(formatter);
System.out.println(formattedDate); // Tuesday,November 1,2011 12:00,AM
Proszę szczegółowo wyjaśnić, jaki masz wynik i jaki oczekiwany rezultat. Nie jestem bezpośrednio w stanie przekazać ci osobiście, aby zobaczyć problem na własne oczy. Mogę przynajmniej powiedzieć, że opublikowany kod działa dobrze dla mnie i że otrzymałem wynik, jak pokazano w komentarzu ostatniej linii. – BalusC
Właściwie to popełniłem błąd, aby wyraźnie opublikować pytanie.Tutaj pracuję z timingami chicago USA. I moje sekundy to 1320105600. Prawidłowy wynik dla tego pytania to wtorek, listopad 0l, 2011 7:00, ale w poniedziałek, 31 października , 2011 7: 00, PM za pomocą powyższego kodu. – androiduser
Rozumiem, że istnieje różnica strefy czasowej, ale 12 godzin? – BalusC
int seconds = 1320105600;
Date date = new Date(seconds * 1000);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE,MMMM d,yyyy h:mm,a");
System.out.println(sdf.format(date));
Answer by BalusC jest dobry w tym, że punkty do korzystania java.time. Ale ta odpowiedź używa LocalDateTime
, gdzie bardziej odpowiednie jest Instant
. A LocalDateTime
jest na osi czasu, ponieważ celowo nie ma koncepcji offset-from-UTC lub time zone.
Ramy java.time jest wbudowana w Java 8 i późniejszych. Klasy te zastępują stare, kłopotliwe klasy czasu i daty, takie jak java.util.Date
, .Calendar
, java.text.SimpleDateFormat
. Zespół Joda-Time zaleca również migrację do java.time. Aby uzyskać więcej informacji, zobacz
. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień.
Znaczna część java.funkcja czasu została przeniesiona do Java 6 & 7 w ThreeTen-Backport i dodatkowo przystosowana do systemu Android w wersji ThreeTenABP.
Instant
Chwila na osi czasu w UTC o rozdzielczości do nanoseconds jest reprezentowana przez klasę Instant
.
Instant instant = Instant.ofEpochSecond (1_320_105_600L);
Zrzut na konsolę. Twoja wartość wejściowa to pierwszy moment z 1 listopada 2011 r. W UTC. Z
na końcu, skrót od "Zulu", oznacza UTC.
System.out.println ("instant: " + instant);
natychmiastowy: 2011-11-01T00: 00: 00Z
ZonedDateTime
W swoich komentarzach można wymienić chcąc zobaczyć to Date-Time przez pryzmat czasu America/Chicago
strefa. Użyj proper time zone name. Zastosuj strefę czasową, ZoneId
, aby uzyskać obiekt ZonedDateTime
. Widzimy, że Chicago jest pięć godzin za UTC w tym dniu.
ZoneId zoneId = ZoneId.of ("America/Chicago");
ZonedDateTime zdt = instant.atZone (zoneId);
ZDT: 2011-10-31T19: 00-05: 00 [Ameryka/Chicago]
strun widać powyżej są w standardowym formacie ISO 8601. Aby wygenerować ciągi w innych formatach, należy użyć klasy DateTimeFormatter
. Możesz określić swój własny wzorzec. Ale zwykle najlepiej jest pozwolić, aby java.time automatycznie lokalizował się w języku ludzkim i normach kulturowych zakodowanych w obiekcie Locale
.
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime (FormatStyle.FULL);
formatter = formatter.withLocale (Locale.US);
String output = zdt.format (formatter);
Poniedziałek, 31 października 2011 19:00:00 CDT
Aby określić swój własny format niestandardowy, wyszukiwania przepełnienie stosu dla wielu przykładów i więcej dyskusji.
Jednym z pomysłów jest przeglądanie javadocs - na przykład java.util.Date – Ingo