Ceea ce este cel mai elegant mod de a obține ISO 8601 formatat prezentarea momentul actual, UTC? Acesta ar trebui să arate astfel: 2010-10-12T08:50Z
.
Exemplu:
String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);
Folosi SimpleDateFormat
pentru a formata orice Data
obiect:
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
Folosind o noua Data()` așa cum se arată mai sus va format la ora actuală.
Pentru sistemele de unde fusul Orar prestabilit nu este UTC:
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
Anii SimpleDateFormat
exemplu poate fi declarată ca un nivel global constantă, dacă este necesar în mod frecvent, dar feriți-vă că acest curs nu este thread-safe. Acesta trebuie să fie sincronizate dacă accesate simultan de mai multe fire.
EDIT: as prefera Timp Joda daca faci de multe Ori diferite/Data manipulări... EDIT2: corectat: `setTimeZone nu acceptă un Șir (corectată de către Paul)
java.timp face simplu din Java 8. Și firul de siguranță.
ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )
Rezultatul: 2015-04-14T11:07:36.639 Z
Ai putea fi tentat de a utiliza bricheta
Temporal "precum" Instant " sau " LocalDateTime
, dar ei nu are formator de sprijin sau a datelor de fus orar. Doar pentru ZonedDateTime` funcționează afară de la cutie.
De tuning sau înlănțuirea opțiuni de / operațiunile de ZonedDateTime și DateTimeFormatter, puteți controla cu ușurință fus orar și precizie, de la un anumit grad:
ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
.truncatedTo( ChronoUnit.MINUTES )
.format( DateTimeFormatter.ISO_DATE_TIME )
Rezultatul: 2015-04-14T11:07:00+01:00[Europa/Paris]
Rafinate cerințe, cum ar fi eliminarea secunde parte, trebuie să fie servit de formate personalizate sau personalizate procesul post.
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // 2015-04-14T11:07:00
.format( DateTimeFormatter.ISO_LOCAL_DATE ) // 2015-04-14
.format( DateTimeFormatter.ISO_LOCAL_TIME ) // 11:07:00
.format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm" ) ) // 2015-04-14 11:07
Pentru Java 6 & 7, puteți lua în considerare spate-porturi de java.timp, cum ar fi ThreeTen-Backport, care are, de asemenea, un port Android. Ambele sunt mai ușoare decât Joda, și a învățat de la Joda's experienta - esp. având în vedere că java.timpul este proiectat de Joda's autor.
Java 8:
thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX")
.withZone(ZoneOffset.UTC)
.format(Instant.now());
Pre Java 8:
thisMoment = String.format("%tFT%<tRZ",
Calendar.getInstance(TimeZone.getTimeZone("Z")));
De la documente:
'R'
Timp formatate pentru ceas de 24 de ore ca "%lea:%tM"
'F'
ISO 8601 completați data formatat ca "%tY-%tm-%td".
Ca de Java 8, puteți face pur și simplu:
Instant.now().toString();
De java.timp.Instant
documente:
acum
public static Instant acum()`
Obține curent instantanee de la ceasul de sistem.
Acest lucru va interoga sistem UTC ceas să obțină curent instant.
toString
public String toString()`
Un șir de reprezentare a acestui instant folosind ISO-8601 reprezentare.
formatul folosit este același ca
DateTimeFormatter.ISO_INSTANT
.
folosi JodaTime
ISO 8601 calendar sistemul este implicit punerea în aplicare în termen de Joda Timp
Aici este doc pentru JodaTime de Formatare
Edit:
Dacă tu nu't doriți să adăugați sau, dacă nu't vedea valoare de adăugarea de mai sus bibliotecă, ai putea folosi doar în construit `SimpleDateFormat clasa a format la Data de necesare format ISO
cum a sugerat de către @Joachim Sauer
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());
Dacă tu nu't doriți să includeți Jodatime (la fel de frumos ca acesta este)
javax.xml.bind.DatatypeConverter.printDateTime(
Calendar.getInstance(TimeZone.getTimeZone("UTC"))
);
care returnează un șir de:
2012-07-10T16:02:48.440Z
care este ușor diferită de la cererea inițială, dar este încă ISO-8601.
Actualizare: La Joda-Time proiectul este acum în modul de întreținere, cu echipa care a asistat migrației la java.time clase. Pentru Java 6 & 7, a se vedea ThreeTen-Backport proiectul, de asemenea, adaptate pentru Android în ThreeTenABP proiect.
Folosind Joda-Time biblioteca...
String output = new DateTime( DateTimeZone.UTC ).toString() ;
Acesta este thread-safe. Joda Timp creează noi imuabil obiecte mai degrabă decât schimbarea obiectelor existente.
Dacă ești cu adevărat destinat pentru a cere un format fără secunde, rezolvarea de minute, apoi utilizați una dintre multe alte built-in formatters în Joda Timp.
DateTime now = new DateTime( DateTimeZone.UTC ) ;
String output = ISODateTimeFormat.dateHourMinute.print( now ) ;
Pentru Java 8 și mai târziu, Joda Timp continuă să lucreze. Dar built-in java.time - cadru înlocuiește Joda Timp. Deci migra codul de Joda-Timp pentru java.timp de indata ce este convenabil.
Vedea pe alt Răspuns pentru o soluție modernă.
De java.timp cadrul este construit în Java 8 și mai târziu. Aceste clase înlocui supărătoare vechi legacy data de clase, cum ar fi java.util.Data
, Calendar
, & SimpleDateFormat
.
De Joda-Time, proiect, acum în modul de întreținere, sfătuiește migrației la java.time clase.
Pentru a afla mai multe, consultați Oracle Tutorial. Și de căutare Stack Overflow pentru mai multe exemple și explicații. Caietul de sarcini este JSR 310.
Posibil schimb java.timp obiecte direct cu baza dumneavoastră de date. Utilizați un JDBC driver compatibil cu JDBC 4.2 sau mai târziu. Nu este nevoie pentru siruri de caractere, nu este nevoie de java.sql.*` clase.
În cazul în care pentru a obține java.timpul clase?
De ThreeTen-Extra proiectul se extinde java.timp cu clase suplimentare. Acest proiect este un teren de testare pentru posibile viitoare completări la java.timp. S-ar putea găsi unele clase utile, cum ar fi Interval
, YearWeek
, YearQuarter
, și mai mult.
Pentru Java versiunea 7
Puteți urmări Oracle documentație: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
X - este folosit pentru ISO 8601 fusul orar
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
System.out.println(nowAsISO);
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
//nowAsISO = "2013-05-31T00:00:00Z";
Date finalResult = df1.parse(nowAsISO);
System.out.println(finalResult);
Ai putea folosi Java's SimpleDateFormat cu următorul model yyyy-MM-dd'T'HH:mm:ssXXX
pentru ISO 8601.
Cod Proba: (liste pentru toate zonele de timp)
for (String timeZone : TimeZone.getAvailableIDs())
{
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
String formatted = dateFormat.format(new Date());
System.out.print(formatted);
if (formatted.endsWith("Z"))
{
// These time zone's have offset of '0' from GMT.
System.out.print("\t(" + timeZone + ")");
}
System.out.println();
}
Ai putea folosi:
de fus Orar.getDefault()
pentru default vm de fus orar. Mai aici
S-ar putea observa la data timp de câteva zone de timp care se termina cu 'Z'
. Aceste zone au offset de'0'
de la GMT.
Mai multe informații pot fi găsite aici.
Unele dintre celelalte Răspunsuri sunt corecte în a recomanda java.timp clase dar cu lungimi inutile pentru nevoile dvs. specifice.
Instant.now() // Capture the current moment in UTC with a resolution as fines nanoseconds but usually in microseconds or milliseconds.
.truncatedTo( ChronoUnit.MINUTES ) // Lop off any seconds or fractional second, to get a value in whole minutes.
.toString() // Generate a String in standard ISO 8601 format where a `T` separates the year-month-day from the hour-minute-second, and the `Z` on the end for “Zulu” means UTC.
2018-01-23T12:34Z
Instant::toString
Anii `jav.timp.Instant clasa reprezintă un moment în UTC, mereu în UTC.
Instant instant = Instant.now() ;
instant.toString(): 2018-01-23T12:34:56.123456 Z
"Z" în final de exemplu string 2010-10-12T08:50Z
se pronunță "Zulu" și înseamnă UTC.
Formatul dorit se întâmplă pentru a se conforma cu ISO 8601 standard. A java.timp clase de a folosi aceste formate standard, în mod implicit atunci când parsarea/generatoare de siruri de caractere. Deci, nu este nevoie pentru a specifica un model de formatare. Doar sun Instant::toString
după cum am văzut mai sus.
Dacă nu doriți în mod special minute întregi fără a doua sau fracționată a doua, apoi a trunchia. Specifica o unitate de timp prin `ChronoUnit clasa.
Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ;
String output = instant.toString(); // Generate a `String` object in standard ISO 8601 format.
De java.timp cadrul este construit în Java 8 și mai târziu. Aceste clase înlocui supărătoare vechi legacy data de clase, cum ar fi java.util.Data
, Calendar
, & SimpleDateFormat
.
De Joda-Time, proiect, acum în modul de întreținere, sfătuiește migrației la java.time clase.
Pentru a afla mai multe, consultați Oracle Tutorial. Și de căutare Stack Overflow pentru mai multe exemple și explicații. Caietul de sarcini este JSR 310.
Posibil schimb java.timp obiecte direct cu baza dumneavoastră de date. Utilizați un JDBC driver compatibil cu JDBC 4.2 sau mai târziu. Nu este nevoie pentru siruri de caractere, nu este nevoie de java.sql.*` clase.
În cazul în care pentru a obține java.timpul clase?
De ThreeTen-Extra proiectul se extinde java.timp cu clase suplimentare. Acest proiect este un teren de testare pentru posibile viitoare completări la java.timp. S-ar putea găsi unele clase utile, cum ar fi Interval
, YearWeek
, YearQuarter
, și mai mult.
Aici's o intreaga clasa optimizat, astfel încât invocarea "now()" nu't face nimic mai mult că are de-a face.
public class Iso8601Util
{
private static TimeZone tz = TimeZone.getTimeZone("UTC");
private static DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
static
{
df.setTimeZone(tz);
}
public static String now()
{
return df.format(new Date());
}
}
private static String getCurrentDateIso()
{
// Returns the current date with the same format as Javascript's new Date().toJSON(), ISO 8601
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
return dateFormat.format(new Date());
}
Dacă îți pasă de performanță, am creat o library, care surclaseaza standard Java parser și formator în manipularea cu ISO8601-formatat date. DatetimeProcessor implementări sunt thread-safe și poate fi depozitată într-un concurente hartă sau câmpuri statice.
``xml <dependență>
``java import com.axibase.data.DatetimeProcessor; import com.axibase.data.PatternResolver; import org.junit.Înainte; import org.junit.De testare;
import java.timp.Ceas; import java.timp.Instant; import java.timp.ZoneId; import java.timp.ZoneOffset;
import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Este.este;
public class DateFormatTest { privat ceas de Ceas;
@Înainte de public void pregăti() { ceas = Ceas.fixe(Instant.ofEpochMilli(1571285405300L), ZoneId.de("Europa/Berlin")); }
@Test public void testIsoMillis(){ final DatetimeProcessor formatare = PatternResolver.createNewFormatter("iso"); assertThat(formatorului.print(ceas.millis(), ZoneOffset.UTC), e("2019-10-17T04:10:05.300 Z")); }
@Test public void testIsoMillisLocalZone(){ final DatetimeProcessor formatare = PatternResolver.createNewFormatter("iso"); assertThat(formatorului.print(ceas.millis(), ceas.getZone()), e("2019-10-17T06:10:05.300+02:00")); }
@Test public void testIsoMinutes(){ final DatetimeProcessor formatare = PatternResolver.createNewFormatter("yyyy-MM-ddTHH:mmXXX"); assertThat(formatorului.print(ceas.millis(), ZoneOffset.UTC), e("2019-10-17T04:10Z")); } }
``
Am făcut-o în Android folosind Calendar și SimpleDateFormat. Următoarea metodă returnează un Calendar cu "GMT" zona de fus Orar (Acest lucru este universal de fus orar). Apoi, puteți utiliza Calendarul de clasă pentru a seta ora între diferite zone de timp, folosind metoda setTimeZone() din Calendarul de clasă.
private static final String GMT = "GMT";
private static final String DATE_FORMAT_ISO = "yyyyMMdd'T'HHmmss";
public static Calendar isoToCalendar(final String inputDate) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT));
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_ISO, Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone(GMT));
Date date = dateFormat.parse(inputDate);
calendar.setTime(date);
} catch (ParseException e) {
Log.e("TAG",e.getMessage());
}
return calendar;
}
AMINTIȚI-vă: Data ora't știu despre zona de fus Orar existența. Din acest motiv, dacă vă depana o data,puteți vedea întotdeauna data fusul orar curent.