Bagaimana cara mendapatkan momen terkini dalam format ISO 8601 dengan tanggal, jam, dan menit?


323

Apa cara paling elegan untuk mendapatkan presentasi ISO 8601 yang diformat untuk momen saat ini, UTC? Seharusnya terlihat seperti: 2010-10-12T08:50Z.

Contoh:

String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);


5
@marcolopes Hati-hati, penggunaan a private static SimpleDateFormattidak aman.
vegemite4me


Mirip dengan Pertanyaan lain ini , tetapi yang terpotong menjadi satu detik sedangkan Pertanyaan ini terpotong menjadi satu menit penuh.
Basil Bourque

Jawaban:


292

Gunakan SimpleDateFormatuntuk memformat Dateobjek apa pun yang Anda inginkan:

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

Menggunakan new Date()seperti yang ditunjukkan di atas akan memformat waktu saat ini.


8
@ Joachim Sisi negatif dari pendekatan "standar" ini adalah saya harus memiliki banyak contoh "yyyy-MM-dd'T'HH:mmZ"dalam aplikasi saya, setiap kali saya memerlukan tanggal yang diformat ISO-8601. Dengan JodaTime, seperti yang saya lihat, saya dapat menggunakan formatter yang telah ditentukan ISODateTimeFormat, yang melakukan pekerjaan ini untuk saya ..
yegor256

8
@Joachim, Zpola berlaku di SimpleDateFormat, bukan melakukan ini: yyyy-MM-dd'T'HH:mm'Z'.
Buhake Sindi

33
-1 Ini memberi Anda tanggal / waktu di zona waktu saat ini - bukan UTC. Jawaban Carlos mencakup kode UTC yang diperlukan.
Scott Rippey

16
Saya baru saja memperbaiki kesalahan zona waktu - karena itu adalah jawaban yang diterima saya pikir itu adalah hal yang benar untuk dilakukan.
BoD

2
Z perlu dikutip seperti "yyyy-MM-dd'T'HH: mm'Z '"
Kimball Robinson

224

Untuk sistem di mana Zona Waktu default bukan 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());

Itu SimpleDateFormat virtual dapat dinyatakan sebagai konstanta global jika sering diperlukan, tetapi berhati-hatilah karena kelas ini tidak aman untuk thread. Ini harus disinkronkan jika diakses secara bersamaan oleh banyak utas.

EDIT: Saya lebih suka Joda Time jika melakukan banyak manipulasi Waktu / Tanggal yang berbeda ...
EDIT2: dikoreksi: setTimeZonetidak menerima String (dikoreksi oleh Paul)


9
Format ini bukan konstanta di mana saja di beberapa built in library?
Daniel Kaplan

Ada dua paket berbeda untuk 'DateFormat', ingatlah untuk menggunakan 'import java.text.DateFormat'
oabarca

3
Jika Anda ingin zona waktu saat ini gunakan TimeZone tz = TimeZone.getDefault (); sebaliknya
oabarca

Anda tidak boleh mengutip 'Z' dalam format karena itu membuatnya secara logis tidak signifikan. Jika TimeZone adalah UTC seperti pada contoh di atas maka Z yang tidak dikutip hanya akan menghasilkan Z dalam output ... namun jika TimeZone bukan UTC maka Z akan tetap menjadi output sebagai UTC yang secara literal menyiratkan ketika waktu mungkin tidak menjadi. Jika sistem konsumsi membaca Z sebagai UTC tetapi waktunya tidak maka waktu akan digeser. Sebaliknya jika parser menggunakan Z yang dikutip tanpa menyetel TimeZone, ia akan mengurai waktu UTC sebagai waktu lokal (lagi-lagi bergeser). Kutipan ini tidak diperlukan jika TZ diset tetapi berbahaya jika tidak.
Matt Whipple

@MattWhipple - tetapi jika Anda menggunakan tanda kutip Z hasilnya akan seperti 2016-06-14T13:56+0000- pertanyaannya adalah meminta sesuatu seperti2016-06-14T13:56Z
user85421

184

Java 8 Asli

java.time membuatnya mudah sejak Java 8. Dan utas aman.

ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )

Hasil: 2015-04-14T11:07:36.639Z

Anda mungkin tergoda untuk menggunakan korek api Temporalseperti Instantatau LocalDateTime, tetapi mereka tidak memiliki dukungan formatter atau data zona waktu. Hanya ZonedDateTimeberfungsi di luar kotak.

Dengan menyetel atau merantai opsi / operasi ZonedDateTime dan DateTimeFormatter , Anda dapat dengan mudah mengontrol zona waktu dan presisi , hingga tingkat tertentu:

ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
             .truncatedTo( ChronoUnit.MINUTES )
             .format( DateTimeFormatter.ISO_DATE_TIME )

Hasil: 2015-04-14T11:07:00+01:00[Europe/Paris]

Persyaratan yang disempurnakan, seperti menghapus bagian detik, masih harus dilayani oleh format khusus atau proses pos kustom.

.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

Untuk Java 6 & 7, Anda dapat mempertimbangkan back-port java.time seperti ThreeTen-Backport , yang juga memiliki port Android . Keduanya lebih ringan dari Joda, dan telah belajar dari pengalaman Joda - esp. mengingat bahwa java.time dirancang oleh penulis Joda.


9
Jawaban yang bagus. Perhatikan kebiasaan baik menetapkan zona waktu secara eksplisit daripada bergantung secara implisit pada zona waktu default JVM saat ini. Anda dapat menentukan zona waktu tertentu jika diinginkan, seperti ZoneId.of( "America/Montreal" ).
Basil Bourque

1
Instan memungkinkan untuk memformatnya dalam format ISO 8601 hanya dengan memanggil metode return DateTimeFormatter.ISO_INSTANT.format(this);
.toString

Ini yang terbaik karena Anda menghindari default.
Christophe Roussy

6
Peringatan: Solusi untuk Java 8 menggunakan ISO_INSTANT memiliki kekhasan yang mengganggu. Ketika milidetik kebetulan 0 mereka tidak termasuk dalam output. Ini diizinkan sesuai dengan standar ISO 8601 tetapi banyak perpustakaan dan parser dalam bahasa lain tidak begitu memaafkan. Jika perlu selalu menyertakan nol gunakan ini sebagai gantinya: DateTimeFormatter ISO_8601 = ofPattern ("yyyy-MM-dd'T'HH: mm: ss.SSSX"). WithZone (UTC);
jurgen

Setelah beralih dari Java 8 ke 11, saya melihat DateTimeFormatter.ISO_INSTANTdan DateTimeFormatter.ISO_DATE_TIMEmenggunakan 6 digit setelah detik, dibandingkan dengan 3, yang tidak lagi diambil oleh Spring @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME).
DanielM

126

Java 8:

thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX")
                              .withZone(ZoneOffset.UTC)
                              .format(Instant.now());

Pra Jawa 8:

thisMoment = String.format("%tFT%<tRZ",
                           Calendar.getInstance(TimeZone.getTimeZone("Z")));

Dari dokumen :

'R'    Waktu diformat untuk jam 24 jam sebagai "% tH:% tM"
'F'    ISO 8601 tanggal lengkap diformat sebagai "% tY-% tm-% td".


26
Baik, Anda memasukkan perpustakaan pihak ketiga tambahan sebagai ketergantungan pada proyek Anda (yang Anda mungkin ingin tetap up to date, dan mengirim dengan aplikasi Anda, hei, itu hanya tambahan 3,2 megabita) dan lakukan DateTime dt = new DateTime(); DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); String str = fmt.print(dt);, atau Anda enkapsulasi return String.format("%tFT%<tRZ", new Date());ke dalam kelas, dan lakukan str = Iso8601Time.now(), di mana pun Anda membutuhkannya. (Ini tidak seperti format ISO akan berubah.) Jika ternyata Anda membutuhkan lebih dari sekedar tanggal saat ini dalam format ISO, gunakan lib.
aioobe

2
Sepenuhnya setuju dengan ini.
yegor256

3
Perhatikan bahwa dimungkinkan untuk mengubah jawaban mana yang ditandai diterima ;-)
aioobe

8
%tFT%<tTZakan mencakup detik; %tFT%<tTZ.%<tLakan mencakup milidetik.
Patrick Linskey

2
Solusi yang sangat rapi, seharusnya menjadi jawaban yang diterima sekarang :)
AbdelHady

94

Pada Java 8, Anda cukup melakukan:

Instant.now().toString();

Dari java.time.Instantdokumen:

sekarang

public static Instant now()

Dapatkan instan saat ini dari jam sistem.

Ini akan meminta sistem UTC jam untuk mendapatkan instan saat ini.

 


public String toString()

Representasi string instan ini menggunakan representasi ISO-8601.

Format yang digunakan sama dengan DateTimeFormatter.ISO_INSTANT.


11
Ini adalah jawaban yang tepat, dan ini adalah skandal bahwa itu tidak diputuskan lebih tinggi dari semua ini dibuat SimpleDateFormats.
David Moles

Senang saya membaca lebih banyak jawaban. Saya setuju, ini harus menjadi jawabannya sekarang.
Xan-Kun Clark-Davis

Dan karena itu toString, dalam banyak kasus Anda bahkan tidak perlu menyebutnya secara eksplisit.
kaya3

1
Peringatan dalam komentar pada jawaban sebelumnya juga berlaku di sini: "Peringatan: Solusi untuk Java 8 menggunakan ISO_INSTANT memiliki kekhasan yang mengganggu. Ketika milidetik terjadi menjadi 0 mereka tidak termasuk dalam output. Ini diperbolehkan sesuai dengan ISO 8601 standar tetapi banyak perpustakaan dan parser dalam bahasa lain tidak begitu pemaaf. "
Dave L.

27

gunakan JodaTime

Sistem kalender ISO 8601 adalah implementasi default dalam Joda-Time

Ini adalah dokumen untuk JodaTime Formatter

Edit:

Jika Anda tidak ingin menambahkan atau jika Anda tidak melihat nilai penambahan pustaka di atas, Anda bisa menggunakan SimpleDateFormatkelas buatan untuk memformat Date ke format ISO yang diperlukan

seperti yang disarankan oleh @ Joachim Sauer

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());

3
Dan bagaimana Anda menghasilkan String yang diformulasikan seperti yang ditunjukkan dalam pertanyaan?
Joachim Sauer

4
Saya akan mengatakan jangan tambahkan library-dependency untuk sesuatu yang sesederhana ini (yang dapat dicapai dengan dua baris kode java). (Tentu, jika persyaratan bertambah, itu cerita lain.)
aioobe

1
@aioobe, jika ini hanya digunakan di beberapa bagian aplikasi maka ok untuk default, dalam kasus jodatime lebih baik.
Jigar Joshi

5
@aioobe jodatime lebih baik dalam hal apa pun, karena ia memiliki ISODateTimeFormat- formatter ISO-8601 yang telah ditentukan.
yegor256

3
@ org.life.java: yang hanya relevan bila Anda dapat beralih ke waktu Jode dengan benar. Anda tidak akan memilikinya, ketika Anda hanya menggunakan fungsi waktu Joda ini.
Joachim Sauer

20

DateFormatUtils dari Apache commons-lang3memiliki konstanta yang berguna, misalnya:DateFormatUtils.ISO_DATETIME_FORMAT


3
Lebih tepatnya, saat sekarang di UTC: DateFormatUtils.format(new Date(), "yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"));saat saat ini di zona waktu default: DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date()); @ yegor256 terima kasih untuk menyebutkan DateFormatUtils, memiliki on board apache commons-lang ada baiknya menggunakan format tanggal.
babinik

19

Jika Anda tidak ingin memasukkan Jodatime (sebaik itu)

javax.xml.bind.DatatypeConverter.printDateTime(
    Calendar.getInstance(TimeZone.getTimeZone("UTC"))
);

yang mengembalikan string:

2012-07-10T16:02:48.440Z

yang sedikit berbeda dengan permintaan asli tetapi masih ISO-8601.



10

Joda-Time

Pembaruan: Proyek Joda-Time sekarang dalam mode pemeliharaan , dengan tim menyarankan migrasi ke kelas java.time . Untuk Java 6 & 7, lihat proyek ThreeTen-Backport , lebih lanjut diadaptasi untuk Android dalam proyek ThreeTenABP .

Menggunakan perpustakaan Joda-Time ...

String output = new DateTime( DateTimeZone.UTC ).toString() ;

Ini aman dari utas. Joda-Time menciptakan objek tidak berubah baru daripada mengubah objek yang ada.

Jika Anda benar-benar berniat untuk meminta format tanpa detik, menyelesaikan ke menit, maka gunakan salah satu dari banyak format bawaan lainnya di Joda-Time.

DateTime now = new DateTime( DateTimeZone.UTC ) ;
String output = ISODateTimeFormat.dateHourMinute.print( now ) ;

waktu java

Untuk Java 8 dan yang lebih baru, Joda-Time terus bekerja. Tapi java.time bawaan framework menggantikan Joda-Time. Jadi, migrasikan kode Anda dari Joda-Time ke java.time sesegera mungkin.

Lihat Jawaban saya yang lain untuk solusi modern.


Tentang java.time

The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti java.util.Date, Calendar, & SimpleDateFormat.

Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .

Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasi adalah JSR 310 .

Anda dapat bertukar objek java.time secara langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu untuk string, tidak perlu untuk java.sql.*kelas.

Di mana mendapatkan kelas java.time?

Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval, YearWeek, YearQuarter, dan lebih .


7

Untuk Java versi 7

Anda dapat mengikuti dokumentasi Oracle: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

X - digunakan untuk zona waktu ISO 8601

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

5

Anda bisa menggunakan Java's SimpleDateFormat dengan pola berikut yyyy-MM-dd'T'HH:mm:ssXXXuntuk ISO 8601.

Kode Contoh: (daftar untuk semua zona waktu yang tersedia)

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

Anda bisa menggunakan:

TimeZone.getDefault ()

untuk zona waktu vm default. Lebih lanjut di sini

Anda mungkin memperhatikan waktu tanggal untuk beberapa zona waktu yang berakhir dengan 'Z'. Zona waktu ini memiliki offset '0'dari GMT.

Info lebih lanjut dapat ditemukan di sini .


5

Saya percaya cara termudah adalah pertama-tama pergi ke instan dan kemudian ke string seperti:

String d = new Date().toInstant().toString();

Yang akan menghasilkan:

2017-09-08T12:56:45.331Z


4
Jika Anda ingin waktu saat ini, tidak perlu melalui Dateobjek kuno . Lakukan saja Instant.now().toString(). Jika Anda mendapat Datedari warisan API, metode Anda adalah yang terbaik.
Ole VV

Sebagai Ole VV berkomentar, kelas lama merepotkan tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian. Lihat Tutorial oleh Oracle .
Basil Bourque

5

tl; dr

Beberapa Jawaban lain benar dalam merekomendasikan kelas java.time tetapi lanjutkan menggunakan panjang yang tidak perlu untuk kebutuhan spesifik Anda.

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

The jav.time.Instantkelas merupakan saat di UTC, selalu dalam UTC.

Instant instant = Instant.now() ;

instant.toString (): 2018-01-23T12: 34: 56.123456Z

Pada Zakhir string contoh Anda 2010-10-12T08:50Zdiucapkan "Zulu" dan berarti UTC .

Format yang Anda inginkan memenuhi standar ISO 8601 . The java.time kelas menggunakan format standar secara default ketika parsing / menghasilkan string. Jadi tidak perlu menentukan pola pemformatan. Panggil sajaInstant::toString seperti yang terlihat di atas.

Jika Anda secara khusus ingin seluruh menit tanpa detik atau fraksional, maka terpotong. Tentukan satuan waktu melalui ChronoUnitkelas.

Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ;
String output = instant.toString();  // Generate a `String` object in standard ISO 8601 format.

Tentang java.time

The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti java.util.Date, Calendar, &SimpleDateFormat.

Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke java.timekelas .

Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasi adalah JSR 310 .

Anda dapat bertukar objek java.time secara langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu untuk string, tidak perlu untuk java.sql.*kelas.

Di mana mendapatkan kelas java.time?

Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval, YearWeek, YearQuarter, dan lebih .


2

Inilah seluruh kelas yang dioptimalkan sehingga memohon "sekarang ()" tidak melakukan apa-apa lagi yang harus dilakukan.

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

9
Menjadikannya statis dapat menyebabkan masalah karena SimpleDateFormat bukan utas aman: "Format tanggal tidak disinkronkan. Disarankan untuk membuat contoh format terpisah untuk setiap utas. Jika beberapa utas mengakses suatu format secara bersamaan, itu harus disinkronkan secara eksternal." docs.oracle.com/javase/7/docs/api/java/text/…
Juha Palomäki

2
Seperti @Juha Palomäki sebutkan, ini bukan threadsafe. Jika Anda menggunakan Java 8 atau lebih tinggi, ThreadLocal.withInitial dapat memperbaikinya. Jika Anda menggunakan Java 7 atau lebih rendah, buat ThreadLocal baru dan berikan nilai awal dengan
mengganti

@ user393274 - jika Anda menggunakan Java 8 Anda harus menggunakan Instant, DateTimeFormatdan penggantian aman modern lainnya

Saya agak bingung dengan apa masalahnya dengan SimpleDateFormat yang tidak aman. Jika dua utas menjalankan penginisialisasi statis pada saat yang sama, saya tidak dapat melihat sesuatu yang lebih buruk terjadi daripada konstruktor SimpleDateFormat dipanggil dua kali tetapi hanya satu instan (yang terakhir selesai) direkam sebagai "df".
gilbertpilz

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

1

Namun, joda-time hanya mendukung format yang diperluas: "2015-12-09T00: 22: 42.930Z" bukan dasar: "20151209T002242.930Z" ... kita mungkin lebih baik menguji daftar format dengan java SimpleDateFormat.


1

Saya melakukannya di Android menggunakan Kalender dan SimpleDateFormat. Metode berikut mengembalikan Kalender dengan TimeZone "GMT" (Ini adalah zona waktu universal). Kemudian Anda dapat menggunakan kelas Kalender untuk mengatur jam di antara zona waktu yang berbeda, menggunakan metode setTimeZone () dari kelas Kalender.

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

INGAT: Kelas Date tidak tahu tentang keberadaan TimeZone. Dengan alasan ini, jika Anda men-debug satu tanggal, Anda selalu melihat tanggal untuk zona waktu Anda saat ini.


1

Jika Anda peduli dengan kinerja, saya membuat perpustakaan yang mengungguli parser dan formatter Java standar dalam memanipulasi dengan tanggal berformat ISO8601. Implementasi DatetimeProcessor adalah thread-safe dan dapat di-cache di peta bersamaan atau bidang statis.

<dependency>
  <groupId>com.axibase</groupId>
  <artifactId>date-processor</artifactId>
  <version>1.0.3</version>
</dependency>
import com.axibase.date.DatetimeProcessor;
import com.axibase.date.PatternResolver;
import org.junit.Before;
import org.junit.Test;

import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;

public class DateFormatTest {
    private Clock clock;

    @Before
    public void prepare() {
        clock = Clock.fixed(Instant.ofEpochMilli(1571285405300L), ZoneId.of("Europe/Berlin"));
    }

    @Test
    public void testIsoMillis(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("iso");
        assertThat(formatter.print(clock.millis(), ZoneOffset.UTC), is("2019-10-17T04:10:05.300Z"));
    }

    @Test
    public void testIsoMillisLocalZone(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("iso");
        assertThat(formatter.print(clock.millis(), clock.getZone()), is("2019-10-17T06:10:05.300+02:00"));
    }

    @Test
    public void testIsoMinutes(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("yyyy-MM-ddTHH:mmXXX");
        assertThat(formatter.print(clock.millis(), ZoneOffset.UTC), is("2019-10-17T04:10Z"));
    }
}

0

Mereka seharusnya menambahkan semacam cara sederhana untuk beralih dari Date ke Instant dan juga metode yang disebut toISO8601, yang banyak dicari orang. Sebagai pelengkap jawaban lain, dari format java.util.Date ke ISO 8601:

Instant.ofEpochMilli(date.getTime()).toString();

Itu tidak benar-benar terlihat saat menggunakan pelengkapan otomatis tetapi java.time.Instant.toString()::

Representasi string instan ini menggunakan ISO-8601


0
DateTimeFormatter.ISO_DATE_TIME
        .withZone(ZoneOffset.UTC)
        .format(yourDateObject.toInstant())

Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana kode ini menjawab pertanyaan meningkatkan nilai jangka panjangnya.
Vishal Chhodwani

-2

Coba ini,

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ");
        String date=sdf.format (new Date() );

Untuk format ISO 8601


2
Ini akan menggunakan tanggal di zona waktu yang salah, lihat jawaban oleh Carlos.
Stian Soiland-Reyes
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.