2012-12-17 15 views
17

Potrzebuję przekonwertować ciąg zawierający datę na obiekt daty. Ciąg będzie miał format "rrrr-mm-dd HH: mm: ss.SSSSSS" i chcę mieć ten sam format w obiekcie daty.Obiekt Java String to Date w formacie "rrrr-mm-dd GG: mm: ss"

Na przykład mam ciąg "2012-07-10 14: 58: 00.000000" i potrzebuję, aby wynikowy obiekt daty był tego samego formatu.

Próbowałem poniższych metod, ale wypadkowa jest inna niż oczekiwano.

java.util.Date temp = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss.SSSSSS").parse("2012-07-10 14:58:00.000000"); 

DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); 
       Date thisDate = dateFormat.parse("2012-07-10 14:58:00.000000"); 

Rezultatem jest "Wt 10 stycznia 14:58:00 EST 2012". Daj mi znać, gdzie się nie mylę.

Dzięki, Yeshwanth Kota

+0

Co daje wynik "Wt 10 stycznia 14:58:00 EST 2012"? Czy używasz 'System.out.println (thisDate)'? – Gili

+2

Używasz 'mm' dla minut i miesięcy. Jak dokładnie oczekiwałeś, że 'SimpleDateFormat' rozróżni minuty i miesiące w podanym ciągu? Przeczytaj ponownie tabelę wzorów w javadoc: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html – BalusC

+0

@Gili: Tak, używam System.out.println (thisDate). –

Odpowiedz

44
java.util.Date temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").parse("2012-07-10 14:58:00.000000"); 

mm jest minuta chcesz MM

CODE

public class Test { 

    public static void main(String[] args) throws ParseException { 
     java.util.Date temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS") 
       .parse("2012-07-10 14:58:00.000000"); 
     System.out.println(temp); 
    } 
} 

Drukuje:

Wto 10 lipca 14:58:00 EDT 2012

+0

Użyłem System.out.println (temp), a wynik jest nadal taki sam. Przepraszam, jeśli popełniam jakiś głupi błąd, ale nie jestem w stanie tego rozgryźć. –

+0

@YeshwanthKota Czy przekompilowałeś swój kod? – Woot4Moo

+0

Tak, zrobiłem. Po prostu mam System.out.println (temp); w moim kodzie. –

0

Na przyszłość:

yyyy => 4 digit year 
MM => 2 digit month (you must type MM in ALL CAPS) 
dd => 2 digit "day of the month" 

HH => 2-digit "hour in day" (0 to 23) 
mm => 2-digit minute (you must type mm in lowercase) 
ss => 2-digit seconds 
SSS => milliseconds 

Więc "yyyy-MM-dd HH: mm: ss" zwraca „2018-01-05 09 : 49: 32"

Ale "MMM dd, yyyy hh: mm A" przychody "05 stycznia 2018 09:49"

tzw przykłady pokazują tylko w https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html wyjście. Nie mówią ci, jakich formatów użyć!

+0

FYI, kłopotliwa klasa 'SimpleDateFormat' była przestarzała od lat przez klasy java.time wbudowane w Java 8 i 9. W szczególności [' DateTimeFormatter'] (https: // docs. oracle.com/javase/9/docs/api/java/time/format/DateTimeFormatter.html). Należy unikać starych klas daty i godziny w pakiecie z najwcześniejszymi wersjami języka Java. –

0

tl; dr

LocalDateTime.parse( 
    "2012-07-10 14:58:00.000000".replace(" " , "T") 
) 

Mikrosekundach nie pasują

Próbujesz wycisnąć wartość z mikrosekund (cyfry sześć dziesiętne) do typu danych może jedynie rozdzielczość milisekund (trzy cyfry po przecinku) . To jest niemożliwe.

Zamiast tego należy użyć typu danych o wystarczająco dokładnej rozdzielczości. Klasa java.time używa rozdzielczości nanosekund (dziewięć cyfr dziesiętnych).

wejście Unzoned nie pasuje do strefowego typ

Próbujesz umieścić wartość pozbawiona offsetu z-UTC lub strefy czasowej w typ danych (Date), który reprezentuje wartości tylko w UTC. Więc dodajesz informacje (przesunięcie UTC), które nie są zamierzone przez dane wejściowe.

Zamiast tego należy użyć odpowiedniego typu danych. W szczególności, java.time.LocalDateTime.

Case-wrażliwy

inne odpowiedzi i komentarze poprawnie wyjaśnić, że kody wzór formatowania jest rozróżniana. Tak więc MM i mm mają różne efekty.

Unikaj klas starszych

kłopotliwego starych klas date-time w pakiecie z najwcześniejszych wersjach Java są teraz Legacy, wyparta przez klasy java.time wbudowanych w Java 8 i późniejszych.

ISO 8601

struny wejściowe prawie zgodne z ISO 8601 standardowych formatach. Wymień SPACE w środku na T, aby zachować pełną zgodność.

Klasy java.time używają standardowych formatów domyślnie podczas analizowania/generowania ciągów. Więc nie trzeba określać wzorca formatowania.

obiekty Date-Time nie mają "format"

i muszę wynikowy obiekt Date być tego samego formatu.

Nie, obiekty daty i czasu nie mają "formatu". Nie łącz obiektów daty i czasu z samymi ciągami. Ciągi są wejściami i wyjściami obiektów. Obiekty przechowują własne wewnętrzne reprezentacje informacji o dacie i godzinie, których szczegóły są dla nas niezwiązane jako wywołujące programistów.

java.time

Twój wkład jest pozbawiona wskaźnik offsetowej-z-UTC lub kłopotliwego strefie mnie. Parsujemy więc jako obiekty pozbawione tych pojęć.

String input = "2012-07-10 14:58:00.000000".replace(" " , "T") ; 
LocalDateTime ldt = LocalDateTime.parse(input) ; 

Generowanie ciągów

Aby wygenerować ciąg reprezentujący wartość swojego LocalDateTime:

  • połączenia toString uzyskać ciąg w standardowym formacie ISO 8601.
  • Stosowanie DateTimeFormatter do tworzenia ciągów w niestandardowych formatach lub automatycznie lokalizowanych formatach.

Przepełnienie stosu przeszukiwania w celu uzyskania dodatkowych informacji, ponieważ tematy te zostały już wiele razy omówione.

ZonedDateTime

LocalDateTime robi nie stanowią dokładny punkt na osi czasu.

Aby określić aktualny moment, należy przypisać strefę czasową. Na przykład południe w Kolkata India przychodzi dużo wcześniej niż południe w Paryżu we Francji. Południe bez strefy czasowej może się zdarzyć w dowolnym momencie w zakresie około 26-27 godzin.

ZoneId z = ZoneId.of("Asia/Kolkata") ; 
ZonedDateTime zdt = ldt.atZone(z) ; 

O java.time

Ramy java.time jest wbudowana w Java 8 i późniejszych. Klasy te 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.

Powiązane problemy