2013-03-31 24 views
31

Próbuję sformatować datę w formacie rrrr-MM-dd'T'HH: mm: ss.SSSz format do rrrr-mm-dd GG: mm: ss, co powinno być łatwe, ale nie mogę go uruchomić.Format Java yyyy-MM-dd'T'HH: mm: ss.SSSz na rrrr-mm-dd GG: mm: ss

datę, która ma być analizowana jest w formie: 2012-10-01T09: 45: 00.000 + 02: 00
Teraz używam tego prostego formatowania dat, aby go sformatować:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz", Locale.FRANCE); 

jednak daje to wynik podobny do 2012-10-01T09: 45: 00.000UTC + 00: 00.

Próbowałem również użyć "yyyy-MM-dd'T'HH: mm: ss.SSSZ" jako wzór i "rrrr-MM-ddHH: mm: ss". Ten ostatni zwraca datę w postaci 2012-10-01T09: 45: 00 blisko, ale jeszcze jej nie ma.

Pomyślałem, że podciąganie kodu T może być trochę nieporządne i generować narzut bez powodu, a zatem jaki byłby właściwy sposób formatowania tych dat?

W celu zilustrowania, że ​​mogę być przekształcona 2012-10-01T09: 45: 00.000 + 02: 00 do 2012-10-01 09:45:00

zdrowie!

+0

Substringing znacznie szybciej/prostsze niż konwersja do/z obiektu daty. Po prostu dzieli się oryginał na dwa podciągi (stałe przesunięcia), a następnie łączy się razem z odstępem między. –

+0

Dlaczego tak jest? Mogę analizować do ponad 100 dat za jednym razem. – Gooey

+0

Nie sądzisz, że dwie operacje na podłańcuchach z zakodowanymi na stałe kombinacjami i kilkoma opcjami konkatenacji byłyby szybsze niż skonstruowanie i wykonanie dwóch formatów daty? –

Odpowiedz

57
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
SimpleDateFormat output = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
Date d = sdf.parse(time); 
String formattedTime = output.format(d); 

To działa. Musisz użyć dwóch SimpleDateFormats, jeden dla wejścia i jeden dla wyjścia, ale da ci to, czego potrzebujesz.

+0

Dołącza 12 na początku ... Oczekuję daty 02/05/2017, ale daje mi 122/05/2017 – VVB

6

Gooye jeśli to możliwe jest użycie Joda czas w swoim projekcie następnie ten kod działa dla mnie:

String dateStr = "2012-10-01T09:45:00.000+02:00"; 
String customFormat = "yyyy-MM-dd HH:mm:ss"; 

DateTimeFormatter dtf = ISODateTimeFormat.dateTime(); 
LocalDateTime parsedDate = dtf.parseLocalDateTime(dateStr); 

String dateWithCustomFormat = parsedDate.toString(DateTimeFormat.forPattern(customFormat)); 
System.out.println(dateWithCustomFormat); 
+2

Dodając więcej zależności za nic. Istnieje w JDK, zobacz odpowiedź Chris Tate – Aubin

+0

Myślę, że będzie działać w java 8, nie dla Java 7 lub poniżej. –

+0

@Sam, będzie działać w dowolnej wersji java, ponieważ używa biblioteki czasu Joda. Wystarczy zaimportować go do projektu i zaimportować wymagane zależności. – moleksyuk

1

Jeśli naprawdę musi być szybka (nie wierzę, że ty):

char[] chars = sourceDate.toCharArray(); 
chars[10] = ' '; 
String targetDate = new String(chars, 0, 19); 
1

starałem się sformatować ciąg daty otrzymania z odpowiedzi JSON np 2016-03-09T04: 50: 00-0800 do rrrr-MM-dd. Oto, co próbowałem i zadziałało i pomogło mi przypisać sformatowany ciąg daty do widżetu kalendarza.

String DATE_FORMAT_I = "yyyy-MM-dd'T'HH:mm:ss"; 
String DATE_FORMAT_O = "yyyy-MM-dd"; 


SimpleDateFormat formatInput = new SimpleDateFormat(DATE_FORMAT_I); 
SimpleDateFormat formatOutput = new SimpleDateFormat(DATE_FORMAT_O); 

Date date = formatInput.parse(member.getString("date")); 
String dateString = formatOutput.format(date); 

To działało. Dzięki.

+0

Ta odpowiedź nie odnosi się do specyfiki pytania. I duplikuje idee przyjętej [3-letniej] odpowiedzi (http://stackoverflow.com/a/15730771/642706). Więc nie widzę żadnej wartości dodanej. Cieszę się, że chcesz wziąć udział w przepełnieniu stosu. Ale twoje odpowiedzi muszą odpowiadać na pytania Pytanie, a nie być duplikatem. –

4

java.time

Mamy nową technologię dla tego problemu: ram java.time wbudowany w Java 8 i późniejszych.

Twój ciąg wejściowy jest w standardowym formacie ISO 8601. Ten standard jest domyślnie używany w klasach java.time do analizowania/generowania tekstowych reprezentacji wartości daty i godziny.

OffsetDateTime odt = OffsetDateTime.parse("2012-10-01T09:45:00.000+02:00"); 

Twoje pytanie sugeruje, że chcesz skrócić do drugiej sekundy.

OffsetDateTime odtTruncatedToWholeSecond = odt.truncatedTo(ChronoUnit.SECONDS); 

Wygląda na to, że chcesz pominąć informacje o przesunięciu i strefie czasowej. Definiuje to wstępnie zdefiniowany formatator DateTimeFormatter.ISO_LOCAL_DATE_TIME.

I najwyraźniej chcesz użyć spacji w środku zamiast standardowego T. Mógłbyś zdefiniować swój własny formatter, ale po prostu wykonałbym manipulację strunami, aby zastąpić T przestrzenią.

String output = odtTruncatedToWholeSecond.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME).replace("T" , " "); 

Wystarczy String Manipulacje

Jak Komentuj pytanie sugeruje, ściśle mówiąc można osiągnąć swój cel pracując tylko z łańcuchami i nie konwersji do wszelkich obiektów Date-Time. Ale podaję tę odpowiedź tutaj zakładając, że możesz mieć inną logikę biznesową do pracy z tymi wartościami daty i czasu.


O java.time

Ramy java.time jest wbudowana w Java 8 i późniejszych. Te klasy zastępują kłopotliwe stare klasy dat-czasu, takie jak java.util.Date, Calendar, & SimpleDateFormat.

Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do klas java.time. Aby uzyskać więcej informacji, zobacz

. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień. Specyfikacja to JSR 310.

Użytkownik może wymieniać obiekty java.time bezpośrednio z bazą danych. Użyj JDBC driver zgodnego z JDBC 4.2 lub nowszym. Nie ma potrzeby ciągi, nie ma potrzeby klas java.sql.*.

Gdzie można uzyskać lekcje java.time?

  • Java SE 8, Java SE 9, a później
    • wbudowanej.
    • Część standardowego interfejsu API języka Java z pakietem implementacji.
    • Java 9 dodaje kilka drobnych funkcji i poprawek.
  • Java SE 6 i Java SE 7
    • Znaczna część funkcjonalności java.time jest back-przeniesiony do Java 6 & 7 w ThreeTen-Backport.
  • Android
    • Późniejsze wersje Androida wdrożeń wiązce klas java.time.
    • Dla wcześniejszego systemu Android projekt ThreeTenABP dostosowuje ThreeTen-Backport (wymieniony powyżej). Zobacz How to use ThreeTenABP….

Projekt ThreeTen-Extra rozciąga java.time z dodatkowych zajęć. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka użytecznych klas, takich jak Interval, YearWeek, YearQuarter i more.

+0

tylko dla java 8 lub wyższej –

+1

@Sangram Właściwie nie, nie tylko Java 8. Wiele funkcji java.time jest przeniesionych do Java 6 i Java 7 w [ThreeTen-Backport] (http: // www. threeten.org/threetenbp/) projekt i dalsze dostosowanie do Androida w projekcie [ThreeTenABP] (https://github.com/JakeWharton/ThreeTenABP). –

0
String dateStr = "2016-09-17T08:14:03+00:00"; 
String s = dateStr.replace("Z", "+00:00"); 
s = s.substring(0, 22) + s.substring(23); 
Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(s); 
Timestamp createdOn = new Timestamp(date.getTime()); 
mcList.setCreated_on(createdOn); 

Java 7 dodatkowe wsparcie dla strefy czasowej deskryptorów zgodnie z ISO 8601. W tym można je stosować w Java 7.

Powiązane problemy