Ceea ce este cel mai bun mod de a converti un Șir de caractere în format 'ianuarie 2, 2010' de la un "Data" în Java?
În cele din urmă, vreau să iasă 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 la data în timp.
Ca's la fel de greu, iar cei java.util.Data de metode setter au fost dezaprobată de Java 1.1 (1997). Pur și simplu, format data, folosind SimpleDateFormat
folosind un format de model de potrivire de intrare string.
În cazul specific al "ianuarie 2, 2010" ca șirul de intrare:
MMMM
model pentru eaaaaa
model pentru ea.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 explicit "Locale" argument. Dacă îl omite, atunci se va folosi default locale, care nu este neapărat limba engleză așa cum este folosit în luna numele șirului de intrare. Dacă locale nu't se potrivesc cu șirul de intrare, atunci ar confuzie obține un java.text.ParseException` chiar dacă atunci când formatul model pare valabil.
Aici's un extras de relevanță din javadoc, listarea toate disponibile în format modele:
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
Rețineți că modelele sunt sensibile la majuscule și că textul bazate pe modele de patru sau mai multe caractere reprezintă forma completă; în caz contrar, un scurt sau o formă prescurtată este folosit, dacă este disponibil. Deci, de exemplu, MMMMM
sau mai mult nu este necesar.
Aici sunt câteva exemple de valid SimpleDateFormat
modele pentru a analiza un șir dat la data de:
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
O notă importantă este că SimpleDateFormat` e nu thread-safe. Cu alte cuvinte, niciodată nu ar trebui să declare și atribuiți-l ca un statică sau variabilă instanță și apoi reutiliza la diferite metode/fire. Întotdeauna trebuie să-l creeze brand nou termen de metoda de aplicare locală.
Dacă se întâmplă să fie pe Java 8 sau mai nou, apoi utilizați DateTimeFormatter
(de asemenea, aici, faceți clic pe link pentru a vedea toate predefinite formatters și disponibile în format modele; tutorial 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ă formatul model se întâmplă să conțină timp, o parte la fel de bine, apoi utilizați LocalDateTime#parse(text, formatare)
în loc de LocalDate#parse(text, formatare)
. Și, dacă formatul model se întâmplă să conțină fusul orar fel de bine, apoi utilizați ZonedDateTime#parse(text, formatare)
în loc.
Aici's un extras de relevanță din javadoc, listarea toate disponibile în format modele:
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;
Nu act de faptul că acesta are mai multe predefinite formatters pentru cele mai populare modele. Deci, în loc de, de exemplu DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLEZĂ);
, ai putea folosi DateTimeFormatter.RFC_1123_DATE_TIME
. Acest lucru este posibil, deoarece acestea sunt, dimpotrivă, să SimpleDateFormat
, fir de siguranță. Ai putea astfel defini, de asemenea, propria dvs., dacă este necesar.
Pentru un anumit input string format, don't nevoie pentru a utiliza explicit DateTimeFormatter
: un standard ISO 8601 în prezent, ca 2016-09-26T17:44:57Z, poate fi analizat direct cu LocalDateTime#parse(text)
cum se utilizează deja ISO_LOCAL_DATE_TIME
formatorului. În mod similar, LocalDate#parse(text)
analizează un ISO dată, fără componenta de timp (a se vedea ISO_LOCAL_DATE
), și ZonedDateTime#parse(text)
analizează un ISO întâlnire cu un offset și fusul orar adăugată (a se vedea ISO_ZONED_DATE_TIME
).
Ah da Java Data discuție, din nou. Să se ocupe cu data de manipulare folosim Data, Calendar, GregorianCalendar, SimpleDateFormat. De exemplu, folosind ianuarie, data de 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 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));
Cu Java 8 avem un nou Data / Ora API (JSR 310).
Felul următor poate fi folosit pentru a analiza data în Java 8, fără bazându-se 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 Java standard 8 clasa reprezentând o data (fără oră). Dacă doriți pentru a analiza valori care să conțină data și ora de informații ar trebui să utilizați LocalDateTime. Pentru valorile orare de utilizare ZonedDateTime. Ambele oferă o parse()metoda similare cu
LocalDate`:
LocalDateTime dateWithTime = LocalDateTime.parse(strWithDateAndTime, dateTimeFormatter);
ZonedDateTime zoned = ZonedDateTime.parse(strWithTimeZone, zoneFormatter);
Lista de formatare de caractere 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;
În timp ce unele dintre răspunsurile sunt corecte tehnic, acestea nu sunt recomandabile.
Câteva note despre Joda Timp urmeze.
În Joda-Time, o DateTime obiectul știe cu adevărat propriu atribuit de fus orar. Acest lucru contrastează java.util.Data clasa care pare să aibă o zonă de timp, dar nu.
Notă în exemplul de cod de mai jos cum am trece-o zonă de timp obiect de formatare care analizează șirul. Asta fusul orar este folosit pentru a interpreta acea dată-timp, ca având loc în care zona de timp. Deci, ai nevoie să se gândească și de a determina zona de timp reprezentată de șirul de intrare.
Când nu mai ai timp porțiune în șirul de intrare, Joda Timp atribuie primul moment al zilei de fusul orar specificat ca timp-de-zi. De obicei, acest lucru înseamnă 00:00:00
, dar nu întotdeauna, pentru că de Daylight Saving Time (DST) sau alte anomalii. Apropo, puteți face același lucru pentru orice DateTime exemplu de asteptare withTimeAtStartOfDay
.
Caracterele utilizate într-un formator's model sunt similare în Joda Timp cu cele din java.util.Data/Calendar dar nu exact la fel. Citiți cu atenție doc.
Noi folosim de obicei imuabil clase în Joda Timp. Mai degrabă decât a modifica o Data existente-obiect Timp, facem apel la metode care creează o nouă instanță a bazat pe alte obiect cu cele mai multe aspecte copiat cu excepția cazului în care modificările au fost dorite. Un exemplu este apelul la `withZone în ultima linie de jos. Imutabilitatea ajută pentru a face Joda Timp foarte thread-safe, și poate face, de asemenea, ceva de lucru mai clar.
Veți avea nevoie de java.util.Data obiecte pentru a le utiliza cu alte cursuri/cadru care nu știu despre Joda Timp obiecte. Din fericire, este foarte ușor să se mute înainte și înapoi.
De la o java.util.Data obiect (aici numit "data") pentru a Joda Timp DateTime...
org.joda.time.DateTime dateTime = new DateTime( date, timeZone );
O altă direcție de Joda-Timp pentru java.util.Data obiect...
java.util.Date date = dateTime.toDate();
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 ) );
Atunci când a alerga...
dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z
În timp ce pe de-a face cu SimpleDateFormat clasa, l's important să ne amintim că Data nu este thread-safe și nu pot partaja un singur obiect cu mai multe fire.
De asemenea, nu este mare diferență între "m" și "M" în cazul în care acoperit de caz este folosit pentru minute și capital de caz este folosit pentru lună. La fel cu "d" și "D". Acest lucru poate cauza subtile bug-uri care de multe ori trecut cu vederea. A se vedea Javadoc sau Ghid pentru a Converti Șirul de la Data în Java pentru mai multe detalii.
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();
}
Aceasta funcționează bine pentru mine.
Simplu două formatters am folosit:
Vom analiza data completă a format 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));
}
De asemenea, SimpleDateFormat nu este disponibil cu unele dintre client-side tehnologii, cum ar fi GWT.
L's o idee bună pentru a merge pentru Calendar.getInstance(), iar cerința este de a compara două date; du-te pentru mult timp data.
Umila mea de a testa programul. Eu l utilizați pentru a juca în jurul cu formatare și uite-up de mult datele pe care le găsesc în log-files (dar cine le-a pus acolo...).
Mea de test program:
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 testelor:
===== 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
Puteți utiliza SimpleDateformat pentru schimbare șir la data de
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = "2000-01-01";
Date date = new Date(sdf.parse(strDate).getTime());
Sursa Link
Pentru Android
Calendar.getInstance().getTime() oferă
Thu Jul 26 15:54:13 GMT+05:30 2018
Utilizare
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);