Java string to date conversion

Jaki jest najlepszy sposób na konwersję String w formacie 'January 2, 2010' na Date w Javie?

Ostatecznie chcę wyodrębnić miesiąc, dzień i rok jako liczby całkowite, aby móc używać

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

Aby zamienić datę na czas.

Author: Mahozad, 2010-11-18

14 answers

To jest trudny sposób, a te metody settera są przestarzałe od wersji Java 1.1 (1997). po prostu sformatuj datę używając SimpleDateFormat używając wzorca formatu pasującego do ciągu wejściowego .

W twoim konkretnym przypadku "2 stycznia 2010" jako ciąg wejściowy:

  1. "Styczeń" jest miesiącem pełnotekstowym, więc użyj dla niego wzoru MMMM]}
  2. "2" to krótki dzień miesiąca, więc użyj dla niego wzoru d.
  3. "2010" jest rokiem czterocyfrowym, więc użyj yyyy wzór na to.

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 jawnego argumentu Locale. Jeśli go pominiesz, to użyje domyślne locale , które niekoniecznie jest angielskie, jak zostało użyte w nazwie miesiąca w ciągu wejściowym. Jeśli Ustawienia regionalne nie pasują do ciągu wejściowego, to mylnie otrzymamy java.text.ParseException, nawet jeśli wzorzec formatowania wydaje się prawidłowy.

Oto Wyciąg istotności z javadoc , zawierający listę wszystkich dostępnych formatów wzory:

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 wzorce uwzględniają wielkość liter i że wzorce tekstowe składające się z czterech lub więcej znaków reprezentują pełną formę; w przeciwnym razie używana jest krótka lub skrócona forma, jeśli jest dostępna. Więc np. MMMMM lub więcej jest niepotrzebne.

Oto kilka przykładów poprawnych wzorców SimpleDateFormat do przetworzenia podanego ciągu:

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ą informacją jest to, że SimpleDateFormat jesta nie wątek Bezpieczny. Innymi słowy, nigdy nie należy deklarować i przypisywać go jako statycznego lub zmienną instancji, a następnie użyć jej ponownie z różnych metod/wątków. Należy zawsze utworzyć go zupełnie nowy w ramach metody local scope.


Java 8 update

Jeśli zdarzy ci się być na Javie 8 lub nowszej, użyj DateTimeFormatter (również tutaj, Kliknij link, aby zobaczyć wszystkie predefiniowane formatery i dostępne wzorce formatów; tutorial jest dostępny tutaj ). Ten nowy API jest inspirowany 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 stanie się zawierać również część czasu, a następnie użyć LocalDateTime#parse(text, formatter) zamiast LocalDate#parse(text, formatter). A jeśli wzorzec formatu zawiera również strefę czasową, użyj ZonedDateTime#parse(text, formatter) zamiast tego.

Oto Wyciąg istotności z javadoc , zawierający listę wszystkich dostępnych wzorców 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;

Należy pamiętać, że ma kilka predefiniowanych formaterów dla bardziej popularnych wzorców. Więc zamiast np. DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);, można użyć DateTimeFormatter.RFC_1123_DATE_TIME. Jest to możliwe, ponieważ są, w przeciwieństwie do SimpleDateFormat, bezpieczne. W ten sposób można również zdefiniować własne, jeśli to konieczne.

Dla określonego formatu ciągu wejściowego, nie musisz używać jawnego DateTimeFormatter: standard ISO 8601 Data, jak 2016-09-26T17:44:57Z, może być parsowany bezpośrednio z LocalDateTime#parse(text) ponieważ już korzysta z ISO_LOCAL_DATE_TIME formatter. Podobnie, LocalDate#parse(text) przetwarza datę ISO bez składnika czasowego (patrz ISO_LOCAL_DATE), oraz ZonedDateTime#parse(text) parses an ISO Data z dodanym offsetem i strefą czasową (zobacz ISO_ZONED_DATE_TIME).

 1448
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-10 12:06:38

Ah tak dyskusja Java date, znowu. Aby poradzić sobie z manipulacją datą używamy Date, Kalendarz, GregorianCalendar i SimpleDateFormat . Na przykład użycie 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));

Wtedy możesz manipulować tym czymś w stylu:

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));
 63
Author: pn1 dude,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 03:27:40
String str_date = "11-June-07";
DateFormat formatter;
Date date;
formatter = new SimpleDateFormat("dd-MMM-yy");
date = formatter.parse(str_date);
 38
Author: Ruthreshwar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-22 23:36:33

W Javie 8 otrzymujemy nowe Api Date / Time (JSR 310 ).

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

String str = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, 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 jest standardową klasą Java 8 do reprezentowania daty (Bez Czasu). Jeśli chcesz analizować wartości zawierające informacje o dacie i czasie, powinieneś użyć LocalDateTime. Dla wartości z strefami czasowymi użyj ZonedDateTime . Oba zapewniają parse() metodę podobną do LocalDate:

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

Lista formatujących znaki 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;
 31
Author: micha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-23 00:11:25

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

  • java.util.Zajęcia z daty i Kalendarza są notorycznie kłopotliwe. Ze względu na wady w projekcie i realizacji, unikać ich. Na szczęście mamy do wyboru dwie inne doskonałe biblioteki data-time:
    • Joda-CZAS
      ta popularna biblioteka 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 się zorientować.
    • java.czas.* pakiet
      ten nowy zestaw klas jest inspirowany Joda-Time I zdefiniowany przez JSR 310. Klasy te są wbudowane w Java 8. Trwa projekt backportowania tych klas do Java 7, ale backportowanie nie jest wspierane przez Oracle.
  • Jak słusznie zauważył Kristopher Johnson w komentarzu do pytania, Pozostałe odpowiedzi ignorują istotne kwestie z:
    • pora dnia
      Date ma zarówno porcję daty, jak i porcję czasu dnia)
    • Strefa czasowa
      początek dnia zależy od strefy czasowej. Jeśli nie określisz strefy czasowej, zostanie zastosowana domyślna Strefa czasowa JVM. Oznacza to, że zachowanie kodu może ulec zmianie po uruchomieniu na innych komputerach lub ze zmodyfikowanym ustawieniem strefy czasowej. Pewnie nie tego chcesz.
    • Locale
      język Locale określa sposób interpretacji słowa (nazwa miesiąca i dnia) napotkane podczas parsowania. (Odpowiedź by BalusC obsługuje to poprawnie.) Również ustawienia regionalne wpływają na wyjście niektórych formatatorów podczas generowania reprezentacji ciągu daty i czasu.

Joda-Czas

Kilka uwag o Joda-Time.

Strefa Czasowa

W Joda-Time , obiekt DateTime naprawdę zna własną przypisaną strefę czasową. To kontrastuje z Javą.util.Klasa daty który wydaje się mieć strefę czasową, ale nie ma.

Zauważ w poniższym przykładzie jak przekazujemy obiekt strefy czasowej do formatera, który przetwarza łańcuch znaków. Ta strefa czasowa jest używana do interpretacji tej daty-czasu jako która miała miejsce w tej strefie czasowej. Więc musisz pomyśleć i określić strefę czasową reprezentowaną przez to wejście łańcuchowe.

Ponieważ nie masz porcji czasu w łańcuchu wejściowym, Joda-Time przypisuje pierwszą chwilę dnia określonej strefy czasowej jako pora dnia. Zazwyczaj oznacza to 00:00:00, ale nie zawsze, z powodu czasu letniego (DST) lub innych anomalii. Przy okazji, możesz zrobić to samo z dowolną instancją DateTime, wywołując withTimeAtStartOfDay.

Wzór Formatera

Znaki używane we wzorze formatera są podobne w Joda-Time do tych w Javie.util.Data / Kalendarz, ale nie dokładnie to samo. Uważnie przeczytaj doc.

Niezmienność

Zwykle używamy niezmiennych klas w Joda-Time. Zamiast modyfikowanie istniejącego obiektu Data-Czas, wywołujemy metody, które tworzą nową instancję fresh na podstawie innego obiektu, którego większość aspektów została skopiowana, z wyjątkiem przypadków, w których pożądane były zmiany. Przykładem jest wywołanie withZone w ostatniej linii poniżej. niezmienność pomaga uczynić czas Joda bardzo bezpiecznym dla wątków, a także może sprawić, że niektóre prace będą bardziej przejrzyste.

Konwersja

Będziesz potrzebował Javy.util.Obiekty Date do użycia z innymi klasami / frameworkiem, które nie wiedzą o obiektach Joda-Time. Na szczęście, bardzo łatwo jest poruszać się tam iz powrotem.

Idąc z Javy.util.Obiekt Date (tutaj o nazwie date) do Joda-Time DateTime...

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

Idąc w przeciwnym kierunku od Joda-Time do Javy.util.Date object ...

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 ) );

When run ...

dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z
 21
Author: Basil Bourque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:29

Podczas pracy z klasą SimpleDateFormat, ważne jest, aby pamiętać, że Data nie jest bezpieczna dla wątków i nie można udostępniać jednego obiektu Date wielu wątkom.

Istnieje również duża różnica między " m " I "M", gdzie małe litery są używane dla minut, a Duże dla miesiąca. To samo z " d " I "D". Może to powodować subtelne błędy, które często są pomijane. Zobacz Javadoc lub Instrukcja konwersji ciągu znaków na datę w Javie więcej szczegóły.

 17
Author: Jim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-22 23:32:02
    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();
    }
Dla mnie działa dobrze.
 14
Author: Luna Kong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-22 23:40:05

Ponadto SimpleDateFormat nie jest dostępny z niektórymi technologiami po stronie klienta, takimi jak GWT .

To dobry pomysł, aby przejść do kalendarza.getInstance (), a Twoim wymaganiem jest porównanie dwóch dat; idź na long date.

 6
Author: Vaishali Kulkarni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-22 23:35:22

Mój skromny program testowy. Używam go do zabawy z formaterem i szukania 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 badań:

===== 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
 5
Author: Dimitri Dewaele,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-05 10:19:49

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

  1. Jaki format daty chcemy?
  2. Który format daty jest rzeczywiście obecny?

Analizujemy pełny format daty do czasu:

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));
}
 5
Author: siddharth patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-22 23:43:34

Możesz użyć SimpleDateformat do zmiany ciągu znaków na date

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = "2000-01-01";
Date date = new Date(sdf.parse(strDate).getTime());
 4
Author: harun ugur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-22 23:46:17

Miałem zadanie, w którym musiałem napisać kod, który pobierze dowolny ciąg znaków i spróbuje przekonwertować go na datę, gdy format łańcucha nie jest znany z góry.

Napisałem ciekawe narzędzie. Oto artykuł, który opisuje ideę: Java 8 java.pakiet czasu: parsowanie dowolnego ciągu znaków do daty . Zostało to zaimplementowane w Javie 8, ale pomysł mógł być zaimplementowany również we wcześniejszych wersjach.

 1
Author: Michael Gantman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-22 23:45:42

Dla Android

Kalendarz.getInstance ().getTime() daje

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

Użyj

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);
 1
Author: Code Spy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-26 10:35:02

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);
 -1
Author: Madhuka Dilhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-31 08:34:15