Șir de caractere Java în conversia Dată (Programare, Java, String, Data, Timp, Conversie De Date)

littleK a intrebat.

Care este cea mai bună modalitate de a converti un String în formatul „2 ianuarie 2010” în format Date în Java?

În cele din urmă, vreau să despart luna, ziua și anul ca numere întregi, astfel încât să pot folosi

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

pentru a converti data în timp.

Comentarii

    16

  • Rețineți că multe dintre răspunsuri ignoră subtilități precum localurile și fusurile orare. Aș recomanda o lectură atentă a documentației pentru clasele Date, Calendar, TimeZone, Locale și SimpleDateFormat înainte de a le utiliza. –  > Por Kristopher Johnson.
  • posibil duplicat al Convert String to java.util.Date –  > Por Ankur.
  • Java 8 oferă un nou API Data/Ora. Dacă utilizați Java 8 (sau mai nou), ar trebui să aruncați o privire la acest răspuns: stackoverflow.com/a/22180505/1115554 –  > Por micha.
  • Toți cei care stabilesc Date sunt depreciați. –  > Por Raedwald.
  • Pentru informarea dvs., vechile clase de date-timp problematice, cum ar fi java.util.Date, , java.util.Calendar, , și java.text.SimpleTextFormat sunt acum moștenite, , înlocuite de clasele java.time clase. A se vedea Tutorial de la Oracle. –  > Por Basil Bourque.
16 răspunsuri
BalusC

Asta e calea cea mai grea, iar cei java.util.Date metode setter au fost eliminate din Java 1.1 (1997). Formatați pur și simplu data folosind SimpleDateFormat utilizând un model de format care să corespundă șirului de intrare.

În cazul dvs. specific, „2 ianuarie 2010” ca șir de intrare:

  1. „January” este luna textului complet, deci utilizați metoda MMMM pentru aceasta
  2. „2” este ziua scurtă a lunii, deci utilizați modelul d modelul pentru aceasta.
  3. „2010” este anul din 4 cifre, deci utilizați modelul yyyy modelul pentru acesta.
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

Rețineți importanța indicatorului explicit Locale explicit. Dacă îl omiteți, se va utiliza modelul locale implicită care nu este neapărat limba engleză, așa cum este folosită în numele lunii din șirul de intrare. În cazul în care locația nu se potrivește cu șirul de intrare, veți primi un mesaj confuz de tipul java.text.ParseException chiar dacă modelul de format pare valid.

Iată un extras relevant din javadoc, , care enumeră toate modelele de format disponibile:

Scrisoare Componenta dată sau oră Prezentare Exemple
G Indicator de epocă Text AD
y Anul Anul 1996; 96
Y Anul săptămânii Anul 2009; 09
M/L Luna în an Luna Iulie; Jul; 07
w Săptămâna din an Număr 27
W Săptămâna din lună Număr 2
D Ziua din an Număr 189
d Ziua din lună Număr 10
F Ziua săptămânii în lună Număr 2
E Ziua din săptămână Text Marți; Marți
u Numărul zilei din săptămână Număr 1
a Marcator am/pm Text PM
H Ora din zi (0-23) Număr 0
k Ora din zi (1-24) Număr 24
K Ora în am/pm (0-11) Număr 0
h Ora în am/pm (1-12) Număr 12
m Minute în oră Număr 30
s Secunda în minute Număr 55
S Milisecundă Număr 978
z Fus orar Fusul orar general Pacific Standard Time; PST; GMT-08:00
Z Fus orar Fusul orar RFC 822 -0800
X Fus orar Fusul orar ISO 8601 -08; -0800; -08:00

Rețineți că modelele sunt sensibile la majuscule și minuscule și că modelele bazate pe text de patru sau mai multe caractere reprezintă forma completă; în caz contrar, se utilizează o formă scurtă sau prescurtată, dacă este disponibilă. Astfel, de exemplu MMMMM sau mai mult nu este necesar.

Iată câteva exemple de modele valabile SimpleDateFormat pentru a analiza un șir de caractere dat până la data de azi:

Șirul de intrare Model
2001.07.04 AD la 12:08:56 PDT yyyy.MM.dd G 'at' HH:mm:ss z
miercuri, 4 iulie ’01 EEE, MMM d, ''yy
12:08 PM h:mm a
ora 12, ora 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

O notă importantă este că SimpleDateFormat este nu sigur pe fire. Cu alte cuvinte, nu ar trebui să o declarați și să o atribuiți niciodată ca variabilă statică sau de instanță și apoi să o reutilizați din diferite metode/filiere. Ar trebui să o creați întotdeauna o variabilă complet nouă în domeniul local al metodei.


Actualizare Java 8

Dacă se întâmplă să aveți Java 8 sau o versiune mai nouă, atunci utilizați DateTimeFormatter (tot aici, faceți clic pe link pentru a vedea toate formatele predefinite și modelele de formate disponibile; tutorialul este disponibil aici). Acest nou API este inspirat de 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

Notă: dacă se întâmplă ca modelul dvs. de format să conțină și partea de timp, atunci utilizați LocalDateTime#parse(text, formatter) în loc de LocalDate#parse(text, formatter). Și, dacă se întâmplă ca modelul de format să conțină și fusul orar, atunci utilizați ZonedDateTime#parse(text, formatter) în loc de .

Iată un extras relevant din javadoc, , care enumeră toate modelele de format disponibile:

Simbol Semnificație Prezentare Exemple
G era text AD; Anno Domini; A
u an an 2004; 04
y anul-era an 2004; 04
D ziua anului număr 189
M/L luna anului număr/text 7; 07; iulie; iulie; J
d ziua lunii număr 10
Q/q trimestrul anului număr/text 3; 03; Q3; al treilea trimestru
Y an bazat pe săptămână an 1996; 96
w săptămâna din săptămâna pe baza anului număr 27
W pe săptămână-lună număr 4
E ziua-săptămânii text Marți; Marți; T
e/c zi a săptămânii localizată număr/text 2; 02; marți; marți; T
F săptămâna lunii număr 3
a am-pm-zi text PM
h ora-am-pm (1-12) număr 12
K ora-de-am-pm (0-11) număr 0
k ora-orei-de-la-mâine-pm (1-24) număr 0
H ora zilei (0-23) număr 0
m minutul din oră număr 30
s al doilea de minut număr 55
S fracțiune de secundă fracțiune 978
A miliard de zile număr 1234
n număr în nanometri de secundă număr 987654321
N număr în nanometri de zi număr 1234000000
V ID-ul fusului orar zone-id America/Los_Angeles; Z; -08:30
z numele fusului orar numele zonei Pacific Standard Time; PST
O zonă localizată zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;
X zone-offset „Z” pentru 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;

Rețineți că are mai multe formate predefinite pentru cele mai populare modele. Astfel, în loc de, de ex. DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);, , puteți folosi DateTimeFormatter.RFC_1123_DATE_TIME. Acest lucru este posibil deoarece, spre deosebire de SimpleDateFormat, , sunt sigure pentru fire. Prin urmare, dacă este necesar, puteți să vă definiți și propriile dvs.

Pentru un anumit format al șirului de caractere de intrare, nu este necesar să folosiți o funcție explicită DateTimeFormatter: un standard ISO 8601 data, cum ar fi 2016-09-26T17:44:57Z, poate fi analizată direct cu LocalDateTime#parse(text) deoarece utilizează deja formatul ISO_LOCAL_DATE_TIME formatorul. În mod similar, LocalDate#parse(text) analizează o dată ISO fără componenta de timp (a se vedea ISO_LOCAL_DATE), iar ZonedDateTime#parse(text) analizează o dată ISO la care se adaugă un decalaj și un fus orar (a se vedea ISO_ZONED_DATE_TIME).

Comentarii

  • Bunăoară, în opțiunea O, , cum se poate lăsa să se tipărească UTC+08:00 în loc de GMT+08:00. Nu am reușit să găsesc nici un exemplu. –  > Por theGamblerRises.
  • Există mai multe moduri de a analiza datele, iată care sunt acestea diferite cazuri de utilizare a DateFormat.parse –  > Por drorw.
  • Bună BalusC, am un șir de caractere 20-JUN-16 12.00.00.000000000 AM, , am nevoie de ajutor pentru a converti acest lucru în Date. Ajutorul tău este foarte apreciat!!! –  > Por mannedear.
  • @mannedear oh, îmi pare rău … asta a fost greșeala mea. Oricum, am primit răspunsul pe care îl puteți vedea aici : stackoverflow.com/questions/50982310/… –  > Por Queendevelopers.
pn1 dude

Ah da, discuția despre Java Date, din nou. Pentru a ne ocupa de manipularea datei folosim Date, , Calendar, , GregorianCalendar, , și SimpleDateFormat. De exemplu, folosind data din ianuarie ca intrare:

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

Apoi puteți manipula această dată cu ceva de genul:

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

Comentarii

    18

  • Nu uitați că ianuarie este numărul lunii… 0 –  > Por Nicolas Zozol.
eshwar
String str_date = "11-June-07";
DateFormat formatter;
Date date;
formatter = new SimpleDateFormat("dd-MMM-yy");
date = formatter.parse(str_date);

Comentarii

    16

  • Care este scopul separării declarațiilor și definițiilor (deși nu se face pentru prima variabilă)? –  > Por Peter Mortensen.
micha

Odată cu Java 8 primim un nou API Data / Ora (JSR 310).

Următoarea modalitate poate fi utilizată pentru a analiza data în Java 8 fără a se baza pe 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 este clasa standard Java 8 pentru reprezentarea unei date (fără oră). Dacă doriți să analizați valori care conțin informații despre dată și oră, trebuie să utilizați LocalDateTime. Pentru valori cu fus orar, utilizați ZonedDateTime. Ambele oferă un parse() similară cu LocalDate:

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

Lista caracterelor de formatare din 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;

Comentarii

  • Cum funcționează fracțiunea de secundă ? Dacă folosesc LocalDateTime date = LocalDateTime.parse(„20140920111713000”,DateTimeFormatter.ofPattern(„yyyyMMddHHmmssSSS”)); eșuează, dar dacă folosesc LocalDateTime date = LocalDateTime.parse(„20140920111713.000”,DateTimeFormatter.ofPattern(„yyyyMMddHHmmss.SSS”)); funcționează –  > Por reos.
Basil Bourque

Deși unele dintre răspunsuri sunt corecte din punct de vedere tehnic, ele nu sunt recomandabile.

  • Clasele java.util.Date &; Calendar sunt notorii și problematice. Din cauza unor defecte de proiectare și implementare, evitați-le. Din fericire, avem de ales între alte două biblioteci excelente de date-timp:
    • Joda-Time
      Această bibliotecă populară cu sursă deschisă și gratuită poate fi utilizată în mai multe versiuni de Java. Multe exemple de utilizare a acesteia pot fi găsite pe StackOverflow. Citirea unora dintre acestea vă va ajuta să vă familiarizați rapid.
    • Pachetul java.time.*
      Acest nou set de clase este inspirat de Joda-Time și definit de JSR 310. Aceste clase sunt încorporate în Java 8. Un proiect este în curs de desfășurare pentru a readuce aceste clase în Java 7, dar această readucere nu este susținută de Oracle.
  • După cum a remarcat corect Kristopher Johnson în comentariul său la întrebare, celelalte răspunsuri ignoră aspecte vitale precum:
    • Ora din zi
      Data are atât o porțiune de dată, cât și o porțiune de oră a zilei)
    • Fusul orar
      Începutul unei zile depinde de fusul orar. Dacă nu specificați un fus orar, se aplică fusul orar implicit al JVM. Aceasta înseamnă că comportamentul codului dvs. se poate schimba atunci când este rulat pe alte calculatoare sau cu o setare modificată a fusului orar. Probabil că nu este ceea ce vă doriți.
    • Locale
      Limbajul Locale specifică modul de interpretare a cuvintelor (numele lunii și al zilei) întâlnite în timpul parsării. (Răspunsul dat de BalusC tratează acest aspect în mod corespunzător.) De asemenea, Locale afectează ieșirea unor formatatori atunci când generează o reprezentare de tip șir de caractere a datei-timp.

Joda-Time

Urmează câteva note despre Joda-Time.

Zona de timp

În Joda-Time, , a DateTime își cunoaște cu adevărat propriul fus orar atribuit. Acest lucru contrastează cu clasa java.util.Date care pare să aibă un fus orar, dar nu este așa.

Observați în codul de exemplu de mai jos cum transmitem un obiect fus orar către formatorul care analizează șirul. Acest fus orar este utilizat pentru a interpreta data-timp ca având loc în acel fus orar. Prin urmare, trebuie să vă gândiți și să determinați fusul orar reprezentat de acel șir de caractere introdus.

Deoarece nu aveți nicio porțiune de timp în șirul de intrare, Joda-Time atribuie primul moment al zilei din fusul orar specificat ca oră a zilei. De obicei, acest lucru înseamnă 00:00:00 dar nu întotdeauna, din cauza Ora de vară (DST) sau a altor anomalii. Apropo, puteți face același lucru pentru orice instanță DateTime prin apelarea lui withTimeAtStartOfDay.

Model de formatare

Caracterele utilizate în modelul unui formator sunt similare în Joda-Time cu cele din java.util.Date/Calendar, dar nu sunt exact aceleași. Citiți cu atenție documentul.

Imutabilitate

De obicei folosim clasele imuabile în Joda-Time. În loc să modificăm un obiect Date-Time existent, apelăm metode care creează o nouă instanță proaspătă bazată pe celălalt obiect, cu majoritatea aspectelor copiate, cu excepția cazurilor în care s-au dorit modificări. Un exemplu este apelarea metodei withZone din ultima linie de mai jos. Imutabilitate ajută la a face Joda-Time foarte sigur pentru fire de execuție și poate, de asemenea, să facă unele lucrări mai clare.

Conversie

Veți avea nevoie de obiecte java.util.Date pentru a le utiliza cu alte clase/framework-uri care nu cunosc obiectele Joda-Time. Din fericire, este foarte ușor să treceți de la una la alta.

Trecerea de la un obiect java.util.Date (numit aici cu numele de date) la Joda-Time DateTime…

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

În sens invers, de la Joda-Time la un obiect java.util.Date…

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

Exemplu de cod

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

Când se execută…

dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z

Jim

În timp ce ne ocupăm de clasa SimpleDateFormat, este important să ne amintim că Date nu este thread-safe și că nu puteți partaja un singur obiect Date cu mai multe fire de execuție.

De asemenea, există o mare diferență între „m” și „M”, unde literele mici sunt folosite pentru minute și majusculele sunt folosite pentru lună. Același lucru este valabil și pentru „d” și „D”. Acest lucru poate cauza erori subtile care adesea sunt trecute cu vederea. A se vedea Javadoc sau Ghid pentru conversia șirurilor de caractere în date în Java pentru mai multe detalii.

Comentarii

  • Această diferență m/M m-a costat 5 minute de frustrare, vă mulțumesc că mi-ați semnalat-o 🙂 –  > Por Buffalo.
  • Sunt surprins că nimeni altcineva nu a menționat acest lucru. Utilizarea SimpleDateFormat în aplicațiile Web (sau în orice altă aplicație cu mai multe fire) este o mare greșeală. Până la Java 7, am folosit „FastDateFormat”. –  > Por JackLThornton.
Luna Kong
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();
}

Pentru mine funcționează bine.

Comentarii

  • Aceasta va returna Wed Dec 04 00:00:00:00 GST 2013 ca ieșire și nu 2013-12-04 –  > Por Shams.
  • ar trebui să fie înfășurat într-un try/catch ParseException –  > Por svarog.
  • Acest lucru nu va returna valori așa cum se așteaptă. Vă rugăm să testați înainte de a da sfaturi –  > Por lifemoveson.
siddharth patel

Simplu două formate pe care le-am folosit:

  1. Ce format de dată dorim?
  2. Ce format de dată este prezent de fapt?

Analizăm întregul format de dată în format de timp:

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

harun ugur

Puteți utiliza SimpleDateformat pentru a schimba șirul de caractere în dată.

Comentarii

  • Metoda SimpleDateFormat parse returnează un obiect dată. Atunci de ce să folosiți constructorul Date? –  > Por nespapu.
Vaishali Kulkarni

De asemenea, SimpleDateFormat nu este disponibil cu unele dintre tehnologiile de pe partea clientului, cum ar fi GWT.

Este o idee bună să folosiți Calendar.getInstance(), iar cerința dvs. este de a compara două date; mergeți la data lungă.

Dimitri Dewaele

Umilul meu program de testare. Îl folosesc pentru a mă juca cu formatul și pentru a căuta date lungi pe care le găsesc în fișierele de jurnal (dar cine le-a pus acolo…).

Programul meu de testare:

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

Rezultatele testului:

===== 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

Code Spy

Sursa Link

Pentru Android

Calendar.getInstance().getTime() oferă

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

Utilizați

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

Shashidhar Reddy

Conversia Șir de caractere în 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;
        }

Asanka Sampath
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
  Date date1 = null;
  Date date2 = null;

  try {
    date1 = dateFormat.parse(t1);
    date2 = dateFormat.parse(t2);
  } catch (ParseException e) {
    e.printStackTrace();
  }
  DateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy");
  String StDate = formatter.format(date1);
  String edDate = formatter.format(date2);

  System.out.println("ST  "+ StDate);
  System.out.println("ED "+ edDate);

Comentarii

  • Scuzați-mă, nu repetați doar ceea ce este deja în mai multe răspunsuri învechite și prost sfătuite, folosind notorietatea problematică și depășită de mult timp SimpleDateFormat clasă și prieteni? Vă recomand să nu folosiți SimpleDateFormat, , DateFormat și Date. În schimb, folosiți LocalDateTime și DateTimeFormatter, , ambele din java.time, API-ul Java modern pentru dată și oră. –  > Por Ole V.V..
Domenico Ruggiano
De la dată la șir de caractere

SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
return sdf.format(date);

De la șir la dată

SimpleDateFormat sdf = new SimpleDateFormat(datePattern); 
return sdf.parse(dateStr);

Din șir de date în alt format

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat newSdf = new SimpleDateFormat("dd-MM-yyyy");
Date temp = sdf.parse(dateStr);
return newSdf.format(temp);

Sursa link.

Madhuka Dilhan

Încercați acest lucru

String date = get_pump_data.getString("bond_end_date");
DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
Date datee = (Date)format.parse(date);