Cum se obține formatul datei cu fusul orar în java

Sunt nou la java. Aș dori să primesc acest format de dată cu fusul orar în text, la sfârșitul lui.

2017-11-23T23:43:45-05:00[America/New_York]

Ceea ce am acum, aș dori să adaug zona de fus orar implicită a utilizatorului ca fus orar la sfârșitul lui. Iată ce am în prezent:

SimpleDateFormat trust = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());

Ceea ce îmi dă (exemplu):

2018-08-17T22:39:39-0400
0
FYI, clasele vechi teribil de dificil, cum ar fi java.util.Date , java.util.Calendar și java.text.SimpleDateFormat sunt acum moștenire , înlocuită de java.time clase integrate în Java 8 și mai târziu. Consultați Tutorial de Oracle .
adăugat autor Basil Bourque, sursa
FYI, clasele vechi teribil de dificil, cum ar fi java.util.Date , java.util.Calendar și java.text.SimpleDateFormat sunt acum moștenire , înlocuită de java.time clase integrate în Java 8 și mai târziu. Consultați Tutorial de Oracle .
adăugat autor Basil Bourque, sursa
@jsDevia Întrebarea pe care ați legat-o nu este un duplicat. (a) Acela este Android, aceasta este Java. (b) Aceasta este doar despre formatul de text folosind offset-from-UTC, în timp ce acesta se întreabă despre numele unei fusuri orare în plus față de offset.
adăugat autor Basil Bourque, sursa
adăugat autor ADM, sursa
Problema dvs. reală este de a converti un obiect Date într-un mod modern ZonedDateTime ? (Nu este nevoie să treceți prin formatarea și parsarea pentru asta.)
adăugat autor Ole V.V., sursa
Problema dvs. reală este de a converti un obiect Date într-un mod modern ZonedDateTime ? (Nu este nevoie să treceți prin formatarea și parsarea pentru asta.)
adăugat autor Ole V.V., sursa
Vă recomandăm să evitați clasa SimpleDateFormat . Nu numai că este depășită, este, de asemenea, o problemă notorie. Astăzi avem mult mai bine în java.time , Java-ul modern data și ora API .
adăugat autor Ole V.V., sursa
Vă recomandăm să evitați clasa SimpleDateFormat . Nu numai că este depășită, este, de asemenea, o problemă notorie. Astăzi avem mult mai bine în java.time , Java-ul modern data și ora API .
adăugat autor Ole V.V., sursa
@ADM Răspunsul este de peste 5 ani și recomandă Timpul Joda. Toată funcționalitatea lui Joda Time a fost de ceva timp în biblioteca standard Java.
adăugat autor Jim Garrison, sursa
@ADM Răspunsul este de peste 5 ani și recomandă Timpul Joda. Toată funcționalitatea lui Joda Time a fost de ceva timp în biblioteca standard Java.
adăugat autor Jim Garrison, sursa
adăugat autor elhampour, sursa
adăugat autor elhampour, sursa

8 răspunsuri

tl; dr

ZonedDateTime                       //Represent a moment as seen in the wall-clock time used by the people of a particular region (a time zone). 
.now(                               //Capture the current moment.
    ZoneId.of( "America/New_York" ) //Specify the time zone through whose wall-clock time we want to perceive the current date and time.
)                                   //Returns a `ZonedDateTime` object.
.toString()                         //Generate text in standard ISO 8601 format extended to append the name of the time zone in square brackets.

2017-11-23T23: 43: 45-05: 00 [America/New_York]

ISO 8601

Standardul ISO 8601 definește multe formate practice pentru a reprezenta valorile date-timp ca text lizibil pentru oameni. Prima bucată din formatul dorit este un format standard:

2017-11-23T23: 43: 45-05: 00

Formatul dorit extinde formatul standard prin adăugarea numelui fusului orar în paranteze pătrate.

2017-11-23T23: 43: 45-05: 00 [America/New_York]

Acest format extins standard este exact comportamentul Metoda ZonedDateTime :: toString . Veți găsi acea clasă însoțită de Java.

ZonedDateTime.now().toString() //Generate text in standard ISO 8601 format extended to append the name of the time zone in square brackets.

Evitați clasele de curs date-moștenire

Clasa SimpleDateFormat face parte din clasele vechi de date care au fost înlocuite cu clasele java.time . Nu folosiți niciodată aceste clase moștenite.

ZonedDateTime

Obțineți momentul curent așa cum se vede în timpul ceasului de perete folosit de oamenii dintr-o anumită regiune (un fus orar).

Specificați un nume de fus orar propriu în formatul continent/regiune , cum ar fi America/Montreal , EST sau IST , deoarece acestea sunt nu !).

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Generează un obiect String care conține text în formatul dorit.

String output = zdt.toString() ; //Generate text in standard ISO 8601 format extended to append the name of the time zone in square brackets.

About java.time

The

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Proiectul Joda-Time , acum în modul de întreținere , recomandă migrarea către java.time clase.

Pentru a afla mai multe, consultați Tutorial Oracle . Și stivă Overflow pentru multe exemple și explicații. Specificația este JSR 310 .

Puteți face schimb de obiecte java.time direct cu baza de date. Utilizați un driver JDBC compatibil cu JDBC 4.2 sau mai târziu. Nu este nevoie de șiruri, nu este nevoie de clase java.sql. * .

Unde se obțin clasele java.time?

Proiectul ThreeTen-Extra extinde java.time cu clase suplimentare . Acest proiect este un motiv doveditor pentru posibile viitoare adăugări la java.time. Puteți găsi aici câteva clase utile, cum ar fi Interval , YearWeek , < code> YearQuarter și mai mult .

2
adăugat

tl; dr

ZonedDateTime                       //Represent a moment as seen in the wall-clock time used by the people of a particular region (a time zone). 
.now(                               //Capture the current moment.
    ZoneId.of( "America/New_York" ) //Specify the time zone through whose wall-clock time we want to perceive the current date and time.
)                                   //Returns a `ZonedDateTime` object.
.toString()                         //Generate text in standard ISO 8601 format extended to append the name of the time zone in square brackets.

2017-11-23T23: 43: 45-05: 00 [America/New_York]

ISO 8601

Standardul ISO 8601 definește multe formate practice pentru a reprezenta valorile date-timp ca text lizibil pentru oameni. Prima bucată din formatul dorit este un format standard:

2017-11-23T23: 43: 45-05: 00

Formatul dorit extinde formatul standard prin adăugarea numelui fusului orar în paranteze pătrate.

2017-11-23T23: 43: 45-05: 00 [America/New_York]

Acest format extins standard este exact comportamentul Metoda ZonedDateTime :: toString . Veți găsi acea clasă însoțită de Java.

ZonedDateTime.now().toString() //Generate text in standard ISO 8601 format extended to append the name of the time zone in square brackets.

Evitați clasele de curs date-moștenire

Clasa SimpleDateFormat face parte din clasele vechi de date care au fost înlocuite cu clasele java.time . Nu folosiți niciodată aceste clase moștenite.

ZonedDateTime

Obțineți momentul curent așa cum se vede în timpul ceasului de perete folosit de oamenii dintr-o anumită regiune (un fus orar).

Specificați un nume de fus orar propriu în formatul continent/regiune , cum ar fi America/Montreal , EST sau IST , deoarece acestea sunt nu !).

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Generează un obiect String care conține text în formatul dorit.

String output = zdt.toString() ; //Generate text in standard ISO 8601 format extended to append the name of the time zone in square brackets.

About java.time

The

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Proiectul Joda-Time , acum în modul de întreținere , recomandă migrarea către java.time clase.

Pentru a afla mai multe, consultați Tutorial Oracle . Și stivă Overflow pentru multe exemple și explicații. Specificația este JSR 310 .

Puteți face schimb de obiecte java.time direct cu baza de date. Utilizați un driver JDBC compatibil cu JDBC 4.2 sau mai târziu. Nu este nevoie de șiruri, nu este nevoie de clase java.sql. * .

Unde se obțin clasele java.time?

Proiectul ThreeTen-Extra extinde java.time cu clase suplimentare . Acest proiect este un motiv doveditor pentru posibile viitoare adăugări la java.time. Puteți găsi aici câteva clase utile, cum ar fi Interval , YearWeek , < code> YearQuarter și mai mult .

2
adăugat

O anumită transmisie poate fi mapată mai mult de un nume, de exemplu UTC-0500 poate fi America/New_York sau America/Toronto sau America/Nassau (probabil că există mai multe). Informațiile geografice mai precise ar fi necesare pentru a alege cea corectă, iar cea "corectă" ar putea depinde și de alți factori.

De aceea nu există nici un API simplu pentru a returna această valoare, nu există un răspuns corect canonic. Va trebui să decideți propriile reguli pentru determinarea șirului și apoi să utilizați baza de date TZ pentru ao prelua.

0
adăugat
Interesant, mulțumesc!
adăugat autor Johnny boy, sursa

O anumită transmisie poate fi mapată mai mult de un nume, de exemplu UTC-0500 poate fi America/New_York sau America/Toronto sau America/Nassau (probabil că există mai multe). Informațiile geografice mai precise ar fi necesare pentru a alege cea corectă, iar cea "corectă" ar putea depinde și de alți factori.

De aceea nu există nici un API simplu pentru a returna această valoare, nu există un răspuns corect canonic. Va trebui să decideți propriile reguli pentru determinarea șirului și apoi să utilizați baza de date TZ pentru ao prelua.

0
adăugat
Interesant, mulțumesc!
adăugat autor Johnny boy, sursa

Utilizați yyyy-MM-dd'T'HH: mm: ssXXX pentru a imprima timpul ca 2017-11-23T23: 43: 45-05: 00 specificator pentru [America/New_York]. Puteți utiliza [zzzz] care se va imprima ca [Ora standard de Est] nu ca [America/New_York]

0
adăugat
@Johnnyboy Utilizați java.time.ZonedDateTime în cazul în care sistemul dvs. Android rulează Java 8 sau ThreeTen Android Backport , dacă nu.
adăugat autor Andreas, sursa
Bine, mulțumesc! Și cum să obțin [America/New_York] în Android?
adăugat autor Johnny boy, sursa

Utilizați yyyy-MM-dd'T'HH: mm: ssXXX pentru a imprima timpul ca 2017-11-23T23: 43: 45-05: 00 specificator pentru [America/New_York]. Puteți utiliza [zzzz] care se va imprima ca [Ora standard de Est] nu ca [America/New_York]

0
adăugat
@Johnnyboy Utilizați java.time.ZonedDateTime în cazul în care sistemul dvs. Android rulează Java 8 sau ThreeTen Android Backport , dacă nu.
adăugat autor Andreas, sursa
Bine, mulțumesc! Și cum să obțin [America/New_York] în Android?
adăugat autor Johnny boy, sursa

Asta ajuta

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ") .withLocale(Locale.ENGLISH);
0
adăugat
Joda-Time? O opțiune, deși majoritatea cred că înlocuirea sa, java.time, este mai bună. Disponibil pe Android (mai vechi) prin ThreeTenABP .
adăugat autor Ole V.V., sursa

Asta ajuta

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ") .withLocale(Locale.ENGLISH);
0
adăugat
Joda-Time? O opțiune, deși majoritatea cred că înlocuirea sa, java.time, este mai bună. Disponibil pe Android (mai vechi) prin ThreeTenABP .
adăugat autor Ole V.V., sursa