Konwersja ciągów Java na datę

886

Jak najlepiej przekonwertować plik Stringw formacie „2 stycznia 2010 r.” Na Datejęzyk Java?

Ostatecznie chcę wyróżnić miesiąc, dzień i rok jako liczby całkowite, aby móc z nich korzystać

Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();

przekonwertować datę na czas.

littleK
źródło
15
Zauważ, że wiele odpowiedzi ignoruje subtelności, takie jak ustawienia regionalne i strefy czasowe. Przed użyciem którejkolwiek z nich zaleciłbym dokładną lekturę dokumentacji dla klas Date, Calendar, TimeZone, Locale i SimpleDateFormat.
Kristopher Johnson
2
możliwy duplikat Konwertuj ciąg na java.util.Date
Ankur
7
Java 8 zapewnia nowy interfejs API daty / godziny. Jeśli używasz Java 8 (lub nowszej), powinieneś
rzucić
2
Wszystkie osoby ustawiające Datesą przestarzałe.
Raedwald
5
FYI, kłopotliwego starych klas date-time, takie jak java.util.Date, java.util.Calendari java.text.SimpleTextFormatsą teraz spuścizny , wyparta przez java.time klas. Zobacz samouczek Oracle .
Basil Bourque,

Odpowiedzi:

1641

To trudna droga, a te java.util.Datemetody ustawiające są przestarzałe od wersji Java 1.1 (1997). Po prostu sformatuj datę, używając SimpleDateFormatwzorca formatu pasującego do ciągu wejściowego .

W konkretnym przypadku „2 stycznia 2010 r.” Jako ciąg wejściowy:

  1. „Styczeń” to miesiąc pełnego tekstu, więc użyj do tego MMMMwzorca
  2. „2” to krótki dzień miesiąca, więc użyj dwzoru.
  3. „2010” jest 4-cyfrowym rokiem, więc użyj yyyywzoru.

String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010

Zwróć uwagę na znaczenie wyraźnego Localeargumentu. Jeśli go pominiesz, użyje domyślnych ustawień regionalnych, które niekoniecznie są angielskie, jak w nazwie miesiąca łańcucha wejściowego. Jeśli ustawienia narodowe nie pasują do ciągu wejściowego, to myląco można uzyskać, java.text.ParseExceptionnawet jeśli wzorzec formatu wydaje się prawidłowy.

Oto wyciąg z javadoc , zawierający wszystkie dostępne wzorce formatów:

Letter  Date or Time Component  Presentation        Examples
------  ----------------------  ------------------  -------------------------------------
G       Era designator          Text                AD
y       Year                    Year                1996; 96
Y       Week year               Year                2009; 09
M/L     Month in year           Month               July; Jul; 07
w       Week in year            Number              27
W       Week in month           Number              2
D       Day in year             Number              189
d       Day in month            Number              10
F       Day of week in month    Number              2
E       Day in week             Text                Tuesday; Tue
u       Day number of week      Number              1
a       Am/pm marker            Text                PM
H       Hour in day (0-23)      Number              0
k       Hour in day (1-24)      Number              24
K       Hour in am/pm (0-11)    Number              0
h       Hour in am/pm (1-12)    Number              12
m       Minute in hour          Number              30
s       Second in minute        Number              55
S       Millisecond             Number              978
z       Time zone               General time zone   Pacific Standard Time; PST; GMT-08:00
Z       Time zone               RFC 822 time zone   -0800
X       Time zone               ISO 8601 time zone  -08; -0800; -08:00

Zauważ, że we wzorach rozróżniana jest wielkość liter, a wzorce tekstowe składające się z czterech lub więcej znaków reprezentują pełną formę; w przeciwnym razie stosuje się krótką lub skróconą formę, jeśli jest dostępna. Więc np. MMMMMWięcej nie jest konieczne.

Oto kilka przykładów prawidłowych SimpleDateFormatwzorców do parsowania danego ciągu do tej pory:

Input string                            Pattern
------------------------------------    ----------------------------
2001.07.04 AD at 12:08:56 PDT           yyyy.MM.dd G 'at' HH:mm:ss z
Wed, Jul 4, '01                         EEE, MMM d, ''yy
12:08 PM                                h:mm a
12 o'clock PM, Pacific Daylight Time    hh 'o''clock' a, zzzz
0:08 PM, PDT                            K:mm a, z
02001.July.04 AD 12:08 PM               yyyyy.MMMM.dd GGG hh:mm aaa
Wed, 4 Jul 2001 12:08:56 -0700          EEE, d MMM yyyy HH:mm:ss Z
010704120856-0700                       yyMMddHHmmssZ
2001-07-04T12:08:56.235-0700            yyyy-MM-dd'T'HH:mm:ss.SSSZ
2001-07-04T12:08:56.235-07:00           yyyy-MM-dd'T'HH:mm:ss.SSSXXX
2001-W27-3                              YYYY-'W'ww-u

Ważną uwagą jest to, że nieSimpleDateFormat jest bezpieczny dla wątków. Innymi słowy, nigdy nie powinieneś deklarować i przypisywać go jako zmiennej statycznej lub zmiennej instancji, a następnie ponownie użyć go z różnych metod / wątków. Zawsze powinieneś stworzyć go zupełnie nowy w ramach metody lokalnej.


Aktualizacja Java 8

Jeśli akurat korzystasz z Javy 8 lub nowszej, użyj DateTimeFormatter(także tutaj, kliknij link, aby zobaczyć wszystkie predefiniowane formaterery i dostępne wzorce formatów; samouczek jest dostępny tutaj ). Ten nowy interfejs API jest inspirowany przez JodaTime .

String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02

Uwaga: jeśli wzorzec formatu zawiera również część czasu, użyj LocalDateTime#parse(text, formatter)zamiast niej LocalDate#parse(text, formatter). A jeśli twój wzór formatu zawiera również strefę czasową, użyj ZonedDateTime#parse(text, formatter)zamiast tego.

Oto wyciąg z javadoc , zawierający wszystkie dostępne wzorce formatów:

Symbol  Meaning                     Presentation  Examples
------  --------------------------  ------------  ----------------------------------------------
G       era                         text          AD; Anno Domini; A
u       year                        year          2004; 04
y       year-of-era                 year          2004; 04
D       day-of-year                 number        189
M/L     month-of-year               number/text   7; 07; Jul; July; J
d       day-of-month                number        10

Q/q     quarter-of-year             number/text   3; 03; Q3; 3rd quarter
Y       week-based-year             year          1996; 96
w       week-of-week-based-year     number        27
W       week-of-month               number        4
E       day-of-week                 text          Tue; Tuesday; T
e/c     localized day-of-week       number/text   2; 02; Tue; Tuesday; T
F       week-of-month               number        3

a       am-pm-of-day                text          PM
h       clock-hour-of-am-pm (1-12)  number        12
K       hour-of-am-pm (0-11)        number        0
k       clock-hour-of-am-pm (1-24)  number        0

H       hour-of-day (0-23)          number        0
m       minute-of-hour              number        30
s       second-of-minute            number        55
S       fraction-of-second          fraction      978
A       milli-of-day                number        1234
n       nano-of-second              number        987654321
N       nano-of-day                 number        1234000000

V       time-zone ID                zone-id       America/Los_Angeles; Z; -08:30
z       time-zone name              zone-name     Pacific Standard Time; PST
O       localized zone-offset       offset-O      GMT+8; GMT+08:00; UTC-08:00;
X       zone-offset 'Z' for zero    offset-X      Z; -08; -0830; -08:30; -083015; -08:30:15;
x       zone-offset                 offset-x      +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z       zone-offset                 offset-Z      +0000; -0800; -08:00;

Pamiętaj, że ma kilka predefiniowanych formatów dla bardziej popularnych wzorów. Więc zamiast np. DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);Możesz użyć DateTimeFormatter.RFC_1123_DATE_TIME. Jest to możliwe, ponieważ w przeciwieństwie do nich są SimpleDateFormatbezpieczne dla nici. W razie potrzeby możesz także zdefiniować własne.

W przypadku określonego formatu ciągu wejściowego nie trzeba używać wyraźnego DateTimeFormatter: standardową datę ISO 8601 , taką jak 2016-09-26T17: 44: 57Z, można bezpośrednio przeanalizować, LocalDateTime#parse(text)ponieważ już używa ISO_LOCAL_DATE_TIMEformatyzatora. Podobnie, LocalDate#parse(text)analizuje datę ISO bez komponentu czasu (patrz ISO_LOCAL_DATE) i ZonedDateTime#parse(text)analizuje datę ISO z dodanym przesunięciem i strefą czasową (patrz ISO_ZONED_DATE_TIME).

BalusC
źródło
Cześć, w opcji O, jak pozwolić drukować UTC+08:00zamiast GMT+08:00. Nie mogłem znaleźć żadnego przykładu.
theGamblerRises
Istnieje wiele sposobów analizowania dat, oto różne przypadki użycia DateFormat.parse
drorw
Cześć BalusC, mam ciąg 20-JUN-16 12.00.00.000000000 AM, potrzebuję pomocy, aby przekonwertować to na datę. Twoja pomoc jest bardzo ceniona!!
mannedear
@mannedear o przepraszam .. to był mój błąd. W każdym razie mam odpowiedź, którą możesz zobaczyć tutaj: stackoverflow.com/questions/50982310/…
Queendevelopers
74

Ach tak, ponownie dyskusja na temat daty Java. Do radzenia sobie z manipulacją datami używamy Date , Calendar , GregorianCalendar i SimpleDateFormat . Na przykład używając daty stycznia jako danych wejściowych:

Calendar mydate = new GregorianCalendar();
String mystring = "January 2, 2010";
Date thedate = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH).parse(mystring);
mydate.setTime(thedate);
//breakdown
System.out.println("mydate -> "+mydate);
System.out.println("year   -> "+mydate.get(Calendar.YEAR));
System.out.println("month  -> "+mydate.get(Calendar.MONTH));
System.out.println("dom    -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow    -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour   -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli  -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm   -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod    -> "+mydate.get(Calendar.HOUR_OF_DAY));

Następnie możesz nimi manipulować za pomocą czegoś takiego:

Calendar now = Calendar.getInstance();
mydate.set(Calendar.YEAR,2009);
mydate.set(Calendar.MONTH,Calendar.FEBRUARY);
mydate.set(Calendar.DAY_OF_MONTH,25);
mydate.set(Calendar.HOUR_OF_DAY,now.get(Calendar.HOUR_OF_DAY));
mydate.set(Calendar.MINUTE,now.get(Calendar.MINUTE));
mydate.set(Calendar.SECOND,now.get(Calendar.SECOND));
// or with one statement
//mydate.set(2009, Calendar.FEBRUARY, 25, now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.MINUTE), now.get(Calendar.SECOND));
System.out.println("mydate -> "+mydate);
System.out.println("year   -> "+mydate.get(Calendar.YEAR));
System.out.println("month  -> "+mydate.get(Calendar.MONTH));
System.out.println("dom    -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow    -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour   -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli  -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm   -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod    -> "+mydate.get(Calendar.HOUR_OF_DAY));
pn1 koleś
źródło
17
Nie zapominaj, że styczeń to numer miesiąca ... 0
Nicolas Zozol
50
String str_date = "11-June-07";
DateFormat formatter;
Date date;
formatter = new SimpleDateFormat("dd-MMM-yy");
date = formatter.parse(str_date);
Ruthreshwar
źródło
13
Jaki jest cel oddzielania deklaracji i definicji (choć nie zrobiono tego dla pierwszej zmiennej)?
Peter Mortensen
43

W Javie 8 otrzymujemy nowe API Data / Czas ( JSR 310 ).

Do parsowania daty w Javie 8 można użyć następującego sposobu, bez polegania na Joda-Time :

 String str = "January 2nd, 2010";

// if we 2nd even we have changed in pattern also it is not working please workout with 2nd 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM Q, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(str, formatter);

// access date fields
int year = date.getYear(); // 2010
int day = date.getDayOfMonth(); // 2
Month month = date.getMonth(); // JANUARY
int monthAsInt = month.getValue(); // 1

LocalDate to standardowa klasa Java 8 do reprezentowania daty (bez czasu). Jeśli chcesz przeanalizować wartości zawierające informacje o dacie i godzinie, powinieneś użyć LocalDateTime . Dla wartości ze strefami czasowymi użyj ZonedDateTime . Oba zapewniają parse()metodę podobną do LocalDate:

LocalDateTime dateWithTime = LocalDateTime.parse(strWithDateAndTime, dateTimeFormatter);
ZonedDateTime zoned = ZonedDateTime.parse(strWithTimeZone, zoneFormatter);

Znaki formatujące listę z DateTimeFormatter Javadoc :

All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters. 
The following pattern letters are defined:

Symbol  Meaning                     Presentation      Examples
------  -------                     ------------      -------
 G       era                         text              AD; Anno Domini; A
 u       year                        year              2004; 04
 y       year-of-era                 year              2004; 04
 D       day-of-year                 number            189
 M/L     month-of-year               number/text       7; 07; Jul; July; J
 d       day-of-month                number            10

 Q/q     quarter-of-year             number/text       3; 03; Q3; 3rd quarter
 Y       week-based-year             year              1996; 96
 w       week-of-week-based-year     number            27
 W       week-of-month               number            4
 E       day-of-week                 text              Tue; Tuesday; T
 e/c     localized day-of-week       number/text       2; 02; Tue; Tuesday; T
 F       week-of-month               number            3

 a       am-pm-of-day                text              PM
 h       clock-hour-of-am-pm (1-12)  number            12
 K       hour-of-am-pm (0-11)        number            0
 k       clock-hour-of-am-pm (1-24)  number            0

 H       hour-of-day (0-23)          number            0
 m       minute-of-hour              number            30
 s       second-of-minute            number            55
 S       fraction-of-second          fraction          978
 A       milli-of-day                number            1234
 n       nano-of-second              number            987654321
 N       nano-of-day                 number            1234000000

 V       time-zone ID                zone-id           America/Los_Angeles; Z; -08:30
 z       time-zone name              zone-name         Pacific Standard Time; PST
 O       localized zone-offset       offset-O          GMT+8; GMT+08:00; UTC-08:00;
 X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
 x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
 Z       zone-offset                 offset-Z          +0000; -0800; -08:00;
Micha
źródło
Jak działa ułamek sekundy? Jeśli użyję LocalDateTime date = LocalDateTime.parse („20140920111713000”, wzorzec DateTimeFormatter.of‌ („rrrrMMddHHm‌ mssSSS”)); nie powiedzie się, ale jeśli użyję LocalDateTime date = LocalDateTime.parse („20140920111713.000”, DateTimeFormatter.o‌ fPattern („rrrrMMddHH‌ mmss.SSS”)); to działa
REOs
27

Chociaż niektóre odpowiedzi są technicznie poprawne, nie są zalecane.

  • Klasy java.util.Date & Calendar są niezwykle kłopotliwe. Ze względu na wady w projektowaniu i wdrażaniu, unikaj ich. Na szczęście mamy do wyboru dwie inne doskonałe biblioteki daty i godziny:
    • Joda-Time
      Ta popularna, bezpłatna biblioteka typu open source może być używana w kilku wersjach Javy. Wiele przykładów jego użycia można znaleźć na StackOverflow. Przeczytanie niektórych z nich pomoże ci szybko przyspieszyć.
    • Pakiet java.time. *
      Ten nowy zestaw klas został zainspirowany Joda-Time i zdefiniowany przez JSR 310. Klasy te są wbudowane w Javę 8. Trwa projekt przeniesienia tych klas do Javy 7, ale backporting nie jest wspierany przez Wyrocznia.
  • Jak słusznie zauważył Kristopher Johnson w swoim komentarzu do pytania, inne odpowiedzi ignorują istotne kwestie:
    • Pora dnia
      Data ma zarówno porcję daty, jak i porę dnia)
    • Strefa czasowa
      Początek dnia zależy od strefy czasowej. Jeśli nie określisz strefy czasowej, zastosowana zostanie domyślna strefa czasowa maszyny JVM. Oznacza to, że zachowanie kodu może ulec zmianie, gdy zostanie uruchomiony na innych komputerach lub ze zmodyfikowanym ustawieniem strefy czasowej. Prawdopodobnie nie to, czego chcesz.
    • Ustawienia
      regionalne Język ustawień regionalnych określa sposób interpretacji słów (nazwa miesiąca i dnia) napotkanych podczas analizy. ( Odpowiedź BalusC obsługuje to poprawnie.) Również ustawienia regionalne wpływają na dane wyjściowe niektórych formatów podczas generowania reprezentacji ciągu daty i godziny.

Joda-Time

Poniżej kilka uwag na temat Joda-Time.

Strefa czasowa

W Joda-Time , A DateTime obiekt naprawdę zna swój własny przypisany strefę czasową. Kontrastuje to z klasą java.util.Date, która wydaje się mieć strefę czasową, ale jej nie ma.

Zwróć uwagę w poniższym przykładowym kodzie, w jaki sposób przekazujemy obiekt strefy czasowej do formatyzatora, który analizuje ciąg. Ta strefa czasowa służy do interpretowania tej daty i godziny jako zdarzenia w tej strefie czasowej. Musisz więc przemyśleć i określić strefę czasową reprezentowaną przez ten ciąg znaków.

Ponieważ nie ma części czasu w ciągu wejściowym, Joda-Time przypisuje pierwszy moment dnia określonej strefy czasowej jako porę dnia. Zwykle oznacza to, 00:00:00ale nie zawsze, ze względu na czas letni (DST) lub inne anomalie. Nawiasem mówiąc, możesz zrobić to samo z dowolną instancją DateTime, dzwoniąc withTimeAtStartOfDay.

Wzorzec formatyzatora

Znaki użyte we wzorcu formatera są podobne w Joda-Time do znaków w java.util.Date/Calendar, ale nie dokładnie takie same. Uważnie przeczytaj dokument.

Niezmienność

Zwykle używamy niezmiennych klas w Joda-Time. Zamiast modyfikować istniejący obiekt Date-Time, wywołujemy metody, które tworzą nową świeżą instancję w oparciu o inny obiekt z większością aspektów skopiowanych, z wyjątkiem przypadków, w których pożądane były zmiany. Przykładem jest połączenie z withZoneostatnią linią poniżej. Niezmienność pomaga uczynić Joda-Time bardzo bezpiecznym dla wątków, a także może uczynić niektóre prace bardziej przejrzystymi.

Konwersja

Będziesz potrzebował obiektów java.util.Date do użytku z innymi klasami / frameworkiem, które nie wiedzą o obiektach Joda-Time. Na szczęście bardzo łatwo jest poruszać się w przód iw tył.

Przechodzenie z obiektu java.util.Date (tutaj o nazwie date) do Joda-Time DateTime…

org.joda.time.DateTime dateTime = new DateTime( date, timeZone );

Idąc w innym kierunku od Joda-Time do obiektu java.util.Date…

java.util.Date date = dateTime.toDate();

Przykładowy kod

String input = "January 2, 2010";

java.util.Locale locale = java.util.Locale.US;
DateTimeZone timeZone = DateTimeZone.forID( "Pacific/Honolulu" ); // Arbitrarily chosen for example.
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MMMM d, yyyy" ).withZone( timeZone ).withLocale( locale );
DateTime dateTime = formatter.parseDateTime( input );

System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime in UTC/GMT: " + dateTime.withZone( DateTimeZone.UTC ) );

Po uruchomieniu…

dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z
Basil Bourque
źródło
20

Podczas pracy z klasą SimpleDateFormat należy pamiętać, że Date nie jest bezpieczny dla wątków i nie można współużytkować jednego obiektu Date z wieloma wątkami.

Istnieje również duża różnica między literami „m” i „M”, gdzie mała litera jest używana w minutach, a duża w przypadku miesiąca. To samo z „d” i „D”. Może to powodować subtelne błędy, które często są pomijane. Aby uzyskać więcej informacji, zobacz Javadoc lub Przewodnik po konwertowaniu ciągów na datę w Javie .

Jim
źródło
1
Ta różnica m / M kosztowała mnie 5 minut frustracji, dziękuję za zwrócenie jej uwagi
Buffalo
Dziwię się, że nikt o tym nie wspominał. Używanie SimpleDateFormat w aplikacjach internetowych (lub dowolnej innej aplikacji wielowątkowej) jest dużym nie-nie. Od wersji Java 7 używałem „FastDateFormat”.
JackLThornton
18
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date;
try {
    date = dateFormat.parse("2013-12-4");
    System.out.println(date.toString()); // Wed Dec 04 00:00:00 CST 2013

    String output = dateFormat.format(date);
    System.out.println(output); // 2013-12-04
} 
catch (ParseException e) {
    e.printStackTrace();
}

Działa dla mnie dobrze.

Luna Kong
źródło
5
To zwróci Śro 04 grudnia 00:00:00 GST 2013 jako wyjście nie 2013-12-04
Shams
należy zapakować w try / catch ParseException
svarog
To nie zwróci wartości zgodnie z oczekiwaniami. Proszę przetestować przed doradzeniem
lifemoveson
7

Możesz użyć SimpleDateformat, aby zmienić ciąg znaków do tej pory

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = "2000-01-01";
Date date = new Date(sdf.parse(strDate).getTime());

harun ugur
źródło
1
Metoda parsowania SimpleDateFormat zwraca obiekt daty. Dlaczego więc korzystać z konstruktora daty?
nespapu
6

Ponadto SimpleDateFormat nie jest dostępny w przypadku niektórych technologii po stronie klienta, takich jak GWT .

Dobrym pomysłem jest skorzystanie z Calendar.getInstance (), a twoim wymaganiem jest porównanie dwóch dat; iść na długą randkę.

Vaishali Kulkarni
źródło
6

Proste dwa formatowniki, których użyliśmy:

  1. Którą datę formatu chcemy?
  2. Która data formatu jest faktycznie obecna?

Analizujemy pełny format daty i godziny:

date="2016-05-06 16:40:32";

public static String setDateParsing(String date) throws ParseException {

    // This is the format date we want
    DateFormat mSDF = new SimpleDateFormat("hh:mm a");

    // This format date is actually present
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-mm-dd hh:mm");
    return mSDF.format(formatter.parse(date));
}
Siddharth Patel
źródło
5

Mój skromny program testowy. Używam go do zabawy z formatyzatorem i wyszukiwania długich dat, które znajduję w plikach dziennika (ale kto je tam umieścił ...).

Mój program testowy:

package be.test.package.time;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

public class TimeWork {

    public static void main(String[] args) {    

        TimeZone timezone = TimeZone.getTimeZone("UTC");

        List<Long> longs = new ArrayList<>();
        List<String> strings = new ArrayList<>();

        //Formatting a date needs a timezone - otherwise the date get formatted to your system time zone.
        //Use 24h format HH. In 12h format hh can be in range 0-11, which makes 12 overflow to 0.
        DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss.SSS");
        formatter.setTimeZone(timezone);

        Date now = new Date();

        //Test dates
        strings.add(formatter.format(now));
        strings.add("01-01-1970 00:00:00.000");
        strings.add("01-01-1970 00:00:01.000");
        strings.add("01-01-1970 00:01:00.000");
        strings.add("01-01-1970 01:00:00.000");
        strings.add("01-01-1970 10:00:00.000");
        strings.add("01-01-1970 12:00:00.000");
        strings.add("01-01-1970 24:00:00.000");
        strings.add("02-01-1970 00:00:00.000");
        strings.add("01-01-1971 00:00:00.000");
        strings.add("01-01-2014 00:00:00.000");
        strings.add("31-12-1969 23:59:59.000");
        strings.add("31-12-1969 23:59:00.000");
        strings.add("31-12-1969 23:00:00.000");

        //Test data
        longs.add(now.getTime());
        longs.add(-1L);
        longs.add(0L); //Long date presentation at - midnight 1/1/1970 UTC - The timezone is important!
        longs.add(1L);
        longs.add(1000L);
        longs.add(60000L);
        longs.add(3600000L);
        longs.add(36000000L);
        longs.add(43200000L);
        longs.add(86400000L);
        longs.add(31536000000L);
        longs.add(1388534400000L);
        longs.add(7260000L);
        longs.add(1417706084037L);
        longs.add(-7260000L);

        System.out.println("===== String to long =====");

        //Show the long value of the date
        for (String string: strings) {
            try {
                Date date = formatter.parse(string);
                System.out.println("Formated date : " + string + " = Long = " + date.getTime());
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }

        System.out.println("===== Long to String =====");

        //Show the date behind the long
        for (Long lo : longs) {
            Date date = new Date(lo);
            String string = formatter.format(date);
            System.out.println("Formated date : " + string + " = Long = " + lo);        
        }
    }
}

Wyniki testów:

===== String to long =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 01-01-1970 24:00:00.000 = Long = 86400000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 31-12-1969 23:59:59.000 = Long = -1000
Formated date : 31-12-1969 23:59:00.000 = Long = -60000
Formated date : 31-12-1969 23:00:00.000 = Long = -3600000
===== Long to String =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 31-12-1969 23:59:59.999 = Long = -1
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:00.001 = Long = 1
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 01-01-1970 02:01:00.000 = Long = 7260000
Formated date : 04-12-2014 15:14:44.037 = Long = 1417706084037
Formated date : 31-12-1969 21:59:00.000 = Long = -7260000
Dimitri Dewaele
źródło
2

Link źródłowy

Dla systemu Android

Calendar.getInstance (). GetTime () daje

Thu Jul 26 15:54:13 GMT+05:30 2018

Posługiwać się

String oldDate = "Thu Jul 26 15:54:13 GMT+05:30 2018";
DateFormat format = new SimpleDateFormat("EEE LLL dd HH:mm:ss Z yyyy");
Date updateLast = format.parse(oldDate);
Code Spy
źródło
0

Konwersja ciągu na datę:

private Date StringtoDate(String date) throws Exception {
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
            java.sql.Date sqlDate = null;
            if( !date.isEmpty()) {

                try {
                    java.util.Date normalDate = sdf1.parse(date);
                    sqlDate = new java.sql.Date(normalDate.getTime());
                } catch (ParseException e) {
                    throw new Exception("Not able to Parse the date", e);
                }
            }
            return sqlDate;
        }
Shashidhar Reddy
źródło
-1

Spróbuj tego

String date = get_pump_data.getString("bond_end_date");
DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
Date datee = (Date)format.parse(date);
Madhuka Dilhan
źródło