Geçerli anı tarih, saat ve dakika ile ISO 8601 formatında nasıl edinebilirsiniz?


323

Geçerli anın UTC 8601 biçimli sunumunu almanın en zarif yolu UTC'dir ? Bu gibi görünmelidir: 2010-10-12T08:50Z.

Misal:

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


5
@marcolopes Dikkat edin, a kullanımı private static SimpleDateFormatiş parçacığı için güvenli değildir.
vegemite4me


Bu diğer soruya benzer şekilde , ancak bir kişi tümüyle kısalırken, bu soru tam olarak kısalır.
Basil Bourque

Yanıtlar:


292

İstediğiniz nesneyi SimpleDateFormatbiçimlendirmek için kullanın Date:

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

new Date()Yukarıda gösterildiği gibi a kullanılması geçerli saati biçimlendirir.


8
@Joachim Bu "standart" yaklaşımın olumsuz tarafı "yyyy-MM-dd'T'HH:mmZ", her ISO-8601 formatlı tarihe ihtiyaç duyduğumda başvurumda birçok örneğe sahip olmam gerektiğidir. JodaTime ile, gördüğüm gibi, benim ISODateTimeFormatiçin bu işi yapan önceden tanımlanmış bir formatlayıcı kullanabilirsiniz ..
yegor256

8
@Joachim, Zdaha doğrusu bunu, SimpleDateFormat geçerli kalıptır: yyyy-MM-dd'T'HH:mm'Z'.
Buhake Sindi

33
-1 Bu, UTC değil, geçerli saat dilimindeki tarihi / saati verir. Carlos'un cevabı gerekli UTC kodunu içerir.
Scott Rippey

16
Sadece saat dilimi hatasını düzelttim - kabul edilen cevap olduğu için yapılacak doğru şey olduğunu düşünüyorum.
BoD

2
Z'nin "yyyy-AA-gg'T'HH: mm'Z '" şeklinde alıntılanması gerekiyor
Kimball Robinson

224

Varsayılan Saat Diliminin UTC olmadığı sistemler için:

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

SimpleDateFormatÖrneğin sık gerekirse küresel sabiti olarak ilan, ancak bu sınıf evreli olmadığını dikkat edilebilir. Birden fazla iş parçacığıyla aynı anda erişiliyorsa senkronize edilmelidir.

DÜZENLEME: Birçok farklı Zaman / Tarih manipülasyonu yapıyorsanız Joda Time'ı tercih ederim ...
EDIT2: corrected: setTimeZonebir String kabul etmiyor (Paul tarafından düzeltildi)


9
Bu biçim bazı yerleşik kütüphanelerin hiçbir yerinde sabit değil mi?
Daniel Kaplan

'DateFormat' için iki farklı paket vardır, 'import
java.text.DateFormat

3
Geçerli saat dilimini istiyorsanız TimeZone kullanın tz = TimeZone.getDefault (); bunun yerine
oabarca

Sen gerektiğini değil o mantıksal önemsiz hale getirdiği biçiminde 'Z' alıntı. TimeZone yukarıdaki örnekte olduğu gibi UTC ise, alıntılanmamış bir Z yalnızca çıktıda Z ile sonuçlanır ... Ancak TimeZone UTC değilse, Z, zamanın olmayabileceği durumlarda UTC'yi gösteren bir değişmez olarak gönderilir. olmak. Tüketici bir sistem Z'yi UTC olarak okur, ancak saat değilse zaman kaydırılır. Bunun tersine, bir ayrıştırıcı alıntılanan Z'yi Zaman Dilimi'ni ayarlamadan kullanırsa UTC zamanlarını yerel zamanlar olarak ayrıştırır (tekrar kaydırır). Bu teklif TZ ayarlanmışsa gerekli değildir, ancak değilse tehlikelidir.
Matt Whipple

@MattWhipple - ancak alıntılanmamış bir Z kullanırsanız sonuç şöyle bir şey olacaktır 2016-06-14T13:56+0000- soru gibi bir şey soruyor2016-06-14T13:56Z
user85421

184

Java 8 Yerel

Java 8. time Java 8 beri kolaylaştırır Ve iş parçacığı güvenli.

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

Sonuç: 2015-04-14T11:07:36.639Z

Sen daha hafif kullanmak için cazip olabilir Temporalgibi Instantya LocalDateTimeama destek veya saat dilimi verileri biçimlendirici yoksundur. Sadece ZonedDateTimekutunun dışında çalışır.

ZonedDateTime ve DateTimeFormatter'ın seçeneklerini / işlemlerini ayarlayarak veya zincirleyerek, saat dilimini ve hassasiyeti belirli bir dereceye kadar kolayca kontrol edebilirsiniz :

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

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

Saniye bölümünü kaldırmak gibi hassas gereksinimler yine de özel biçimler veya özel gönderi işlemi tarafından sunulmalıdır.

.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

Java 6 ve 7 için, bir Android bağlantı noktasına sahip ThreeTen-Backport gibi java.time'ın arka bağlantı noktalarını düşünebilirsiniz . Her ikisi de Joda'dan daha hafif ve Joda'nın deneyimlerinden öğrendi - esp. java.time'ın Joda'nın yazarı tarafından tasarlandığını düşünüyoruz.


9
İyi cevap. JVM'nin geçerli varsayılan saat dilimine dolaylı olarak güvenmek yerine açıkça bir saat dilimi belirtme alışkanlığına dikkat edin . Sen belirtebilirsiniz belirli bir zaman dilimini gibi istenirse ZoneId.of( "America/Montreal" ).
Basil Bourque

1
Instant, sadece .toString () yöntemini çağırarak ISO 8601 biçiminde biçimlendirmeye izin verir:return DateTimeFormatter.ISO_INSTANT.format(this);
VadymVL

Bu en iyisidir çünkü varsayılan ayarlardan kaçınırsınız.
Christophe Roussy

6
Uyarı: ISO_INSTANT kullanan Java 8 çözümünün can sıkıcı bir tuhaflığı var. Milisaniye 0 olduğunda, bunlar çıktıya dahil edilmez. Buna ISO 8601 standardına göre izin verilir, ancak diğer dillerde birçok kütüphane ve ayrıştırıcı bu kadar affedici değildir. Her zaman sıfırları eklemek gerekiyorsa bunun yerine şunu kullanın: DateTimeFormatter ISO_8601 = ofPattern ("yyyy-AA-gg'T'HH: mm: ss.SSSX"). WithZone (UTC);
jurgen

Java 8'den 11'e geçtikten sonra, artık Spring's tarafından alınmayan 3'ün aksine, saniyeden sonra 6 basamak görüyorum DateTimeFormatter.ISO_INSTANTve DateTimeFormatter.ISO_DATE_TIMEkullanıyorum @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());

Java Öncesi 8:

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

Gönderen docs :

'R'    24 saatlik saat için zaman "% tH:% tM"
'F'    olarak biçimlendirildi ISO 8601 tam tarihi "% tY-% tm-% td" olarak biçimlendirildi.


26
Ya projenize bağımlı olarak ekstra bir üçüncü taraf kütüphanesi eklersiniz (güncel tutmak isteyebilirsiniz ve başvurunuzla birlikte gönderebilirsiniz, hey, bu sadece fazladan 3.2 megabayt) ve yapın DateTime dt = new DateTime(); DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); String str = fmt.print(dt);veya kapsülleyin return String.format("%tFT%<tRZ", new Date());bir sınıfa girin ve str = Iso8601Time.now()ihtiyacınız olan her yerde yapın. (ISO biçiminin değişeceği gibi değil.) ISO biçiminde şu anki tarihten daha fazlasına ihtiyacınız olduğu ortaya çıkarsa, bir lib kullanın.
aioobe

2
Buna tamamen katılıyorum.
yegor256

3
Hangi cevabın kabul edilmiş olarak işaretlendiğini değiştirmek mümkün olduğunu unutmayın ;-)
aioobe

8
%tFT%<tTZsaniye içerecektir; %tFT%<tTZ.%<tLmilisaniye içerir.
Patrick Linskey

2
Çok düzgün bir çözüm, şimdiye kadar kabul edilen cevap olmalı :)
AbdelHady

94

Java 8'den itibaren şunları yapabilirsiniz:

Instant.now().toString();

Gönderen java.time.Instantdocs:

şimdi

public static Instant now()

Geçerli anı sistem saatinden alır.

Bu , geçerli anı elde etmek için sistem UTC saatini sorgulayacaktır .

 


public String toString()

ISO-8601 temsilini kullanarak bu anlık bir dize temsili.

Kullanılan biçim aynıdır DateTimeFormatter.ISO_INSTANT.


11
Bu doğru cevap ve tüm bu uydurmalardan daha yüksek bir skora maruz bırakılmadığı bir skandal SimpleDateFormats.
David Moles

Daha fazla cevap okuduğuma sevindim. Katılıyorum, bu cevap şimdi olmalı.
Xan-Kun Clark-Davis

Ve çünkü toString, çoğu durumda bunu açıkça çağırmanıza bile gerek kalmayacak.
kaya3

1
Önceki yanıtın bir yorumunda yapılan uyarı burada da geçerlidir: "Uyarı: ISO_INSTANT kullanan Java 8 çözümü can sıkıcı bir tuhaflığa sahiptir. Milisaniye 0 olduğunda çıktıya dahil edilmezler. ISO 8601'e göre izin verilir standart ancak diğer dillerdeki pek çok kütüphane ve ayrıştırıcı bu kadar affedici değil. "
Dave L.

27

JodaTime kullanın

ISO 8601 takvim sistemi Joda-Time içinde varsayılan uygulamadır

İşte JodaTime Formatter için doktor

Düzenle:

Eklemek istemiyorsanız veya yukarıdaki kütüphanenin eklenmesinin değerini görmüyorsanız SimpleDateFormat, Tarihi gerekli ISO biçimine biçimlendirmek için yerleşik sınıfta kullanabilirsiniz

@Joachim Sauer tarafından önerildiği gibi

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

3
Ve soruda gösterildiği gibi biçimlendirilmiş bir String nasıl üreteceksiniz?
Joachim Sauer

4
Bu kadar basit bir şey için bir kitaplık bağımlılığı eklemeyin söyleyebilirim (iki satır java kodu ile elde edilebilir). (Tabii, gereksinimler artarsa, bu başka bir hikaye.)
aioobe

1
@aioobe, sadece uygulamanın birkaç bölümünde kullanılıyorsa, varsayılan olarak gitmek için tamam, geri kalan durumda jodatime daha iyidir.
Jigar Joshi

5
@aioobe jodatime her durumda daha iyidir, çünkü ISODateTimeFormatISO- 8601'in önceden tanımlanmış bir formatlayıcısına sahiptir.
yegor256

3
@ org.life.java: yalnızca Jode zamanına doğru şekilde geçiş yapabildiğiniz zaman geçerlidir. Joda zamanının sadece bu işlevini kullandığınızda onlara sahip olmayacaksınız.
Joachim Sauer

20

Apache'deki DateFormatUtils öğelerinincommons-lang3 yararlı sabitleri vardır, örneğin:DateFormatUtils.ISO_DATETIME_FORMAT


3
Daha doğrusu, UTC'deki DateFormatUtils.format(new Date(), "yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"));geçerli an: varsayılan saat dilimindeki geçerli an DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date()):; @ yegor256 bahsettiğiniz için teşekkürler DateFormatUtils, apache commons- lang'de tarih formatını kullanmaya değer.
babinik

19

Jodatime'ı dahil etmek istemiyorsanız (olduğu kadar güzel)

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

bir dize döndürür:

2012-07-10T16:02:48.440Z

Orijinal talepten biraz farklı ancak yine de ISO-8601.



10

Joda-Time

Güncelleme: Joda-Time projesi şimdi bakım modunda geçişi danışmanlık ekibi ile, java.time sınıfları. Java 6 ve 7 için bkz ThreeTen-backport ayrıca Android için uyarlanmış proje ThreeTenABP projesi.

Kullanılması Joda-Time kütüphane ...

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

Bu iş parçacığı için güvenlidir. Joda-Time, mevcut nesneleri değiştirmek yerine yeni değiştirilemez nesneler oluşturur .

Saniyeler olmadan çözülen saniyeler olmadan bir biçim istemeyi düşünüyorsanız, Joda-Time'daki diğer birçok yerleşik biçimlendiriciden birini kullanın.

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

java.time

Java 8 ve üstü için Joda-Time çalışmaya devam ediyor. Ancak yerleşik java.time çerçevesi Joda-Time'ı destekliyor. Kodunuzu en kısa sürede Joda-Time'tan java.time'a geçirin.

Görmek Modern bir çözüm için diğer cevabımı .


hakkında java.time

Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski mirası destekliyor tarih-saat sınıflarını java.util.Date,Calendar & SimpleDateFormat.

Joda-Time şimdi proje, bakım modunda java.time sınıflarına geçişi tavsiye ediyor .

Daha fazla bilgi edinmek için Oracle Eğitimi'ne bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Sen değiştirebilir java.time sizin veritabanı ile doğrudan nesneleri. KullanınJDBC 4.2 ile uyumlu JDBC sürücüsü veya sonraki . Dizeye gerek yok, java.sql.*sınıflara gerek yok .

Java.time sınıflarını nereden edinebilirsiniz?

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için bir kanıt zeminidir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .


7

Java sürüm 7 için

Oracle belgelerini takip edebilirsiniz: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

X - ISO 8601 zaman dilimi için kullanılır

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

Java'nın SimpleDateFormatyyyy-MM-dd'T'HH:mm:ssXXX uygulamasını ISO 8601 için aşağıdaki desenle kullanabilirsiniz .

Örnek Kod: (mevcut tüm saat dilimlerini listeler)

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

Kullanabilirsin:

TimeZone.getDefault ()

varsayılan vm saat dilimi için. Daha fazlası burada

İle biten birkaç saat dilimi için tarih saatini görebilirsiniz 'Z'. Bu zaman dilimleri '0'GMT'den dengelenmiştir .

Daha fazla bilgiyi burada bulabilirsiniz .


5

Ben en kolay yolu önce anında ve sonra gibi dize gitmek olduğuna inanıyorum:

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

Hangi sonuç verecektir:

2017-09-08T12:56:45.331Z


4
Eğer şimdiki zaman istiyorsanız, eski moda bir Datenesne geçmeye gerek yok . Sadece yap Instant.now().toString(). Eğer bir amacımız Dateeski bir API, sizin yönteminiz en biridir.
Ole VV

Ole VV'nin yorumladığı gibi java.util.Date, Java gibi eski tarih-saat sınıfları java.util.Calendarve java.text.SimpleDateFormatşimdi miras , Java 8 ve sonraki sürümlerinde yerleşik olarak bulunan java.time sınıflarının yerini alıyor . Oracle'ın Öğreticisine bakın .
Basil Bourque

5

tl; Dr.

Diğer Yanıtların bazıları java.time sınıflarını önermek için doğrudur, ancak özel gereksinimleriniz için gereksiz uzunlukları kullanmaya devam edin.

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

jav.time.InstantSınıf hep UTC UTC bir anını temsil ediyor.

Instant instant = Instant.now() ;

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

ZSenin örneğin dizesinin ucunda 2010-10-12T08:50Z“Zulu” telaffuz ve anlamı da UTC .

İstediğiniz format ISO 8601 standardına uygundur. Java.time dizeleri üreten / ayrıştırılırken sınıflar varsayılan olarak bu standart biçimler kullanır. Bu yüzden bir biçimlendirme deseni belirtmeye gerek yoktur. Sadece araInstant::toString yukarıda görüldüğü gibi .

Özellikle ikinci veya kesirli saniye olmadan tam dakikalar istiyorsanız, kısaltın. ChronoUnitSınıf yoluyla bir zaman birimi belirtin .

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

Hakkında java.time

Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date, Calendar&SimpleDateFormat.

Artık bakım modunda olan Joda-Time projesi java.time'a geçişi tavsiye ediyor sınıflarına .

Daha fazla bilgi için Oracle Eğiticisine bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Sen değiştirebilir java.time sizin veritabanı ile doğrudan nesneleri. JDBC 4.2 veya sonraki bir sürümüyle uyumlu bir JDBC sürücüsü kullanın . Dizeye gerek yok, sınıflara gerek yok .java.sql.*

Java.time sınıflarını nereden edinebilirsiniz?

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için bir kanıt zeminidir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .


2

İşte bütün bir sınıf optimize edilmiştir, böylece "now ()" çağrılması daha fazla bir şey yapmaz.

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
Statik hale getirmek, SimpleDateFormat iş parçacığı için güvenli olmadığından soruna neden olabilir: "Tarih biçimleri eşitlenmez. Her iş parçacığı için ayrı biçim örnekleri oluşturmanız önerilir. Birden çok iş parçacığı aynı anda bir formata erişiyorsa, dış olarak eşitlenmesi gerekir." docs.oracle.com/javase/7/docs/api/java/text/…
Juha Palomäki

2
@Juha Palomäki'nin de belirttiği gibi, bu güvenli değildir. Java 8 veya daha yenisini kullanıyorsanız ThreadLocal.withInitial bunu düzeltebilir. Java 7 veya daha düşük bir sürüm kullanıyorsanız, yeni bir ThreadLocal oluşturun ve ThreadLocal.initialValue
user393274

@ user393274 - Java 8 kullanıyorsanız, kullanmalısınız Instant, DateTimeFormatve diğer modern iş parçacığı güvenli değiştirmeler

Ben SimpleDateFormat iş parçacığı güvenli olmama sorunu ne tarafından biraz şaşkın değilim. İki iş parçacığı aynı anda statik başlatıcı yürütmek, ben SimpleDateFormat yapıcı iki kez çağrı daha kötü bir şey göremiyorum ama sadece bir an (bitirmek için sonuncusu) "df" olarak kaydedilir.
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

Yine de, joda-time sadece genişletilmiş formatı destekliyor: "2015-12-09T00: 22: 42.930Z" temel değil: "20151209T002242.930Z" ... java SimpleDateFormat ile format listesini test etmemiz daha iyi olabilir.


1

Android'de Calendar ve SimpleDateFormat kullanarak yaptım. Aşağıdaki yöntem, "GMT" Saat Dilimi ile bir Takvim döndürür (Bu evrensel saat dilimidir). Ardından, Calendar sınıfının setTimeZone () yöntemini kullanarak farklı saat dilimleri arasındaki saati ayarlamak için Calendar sınıfını kullanabilirsiniz.

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

UNUTMAYIN: Date sınıfı, TimeZone varlığını bilmiyor. Bu nedenle, bir tarihte hata ayıklarsanız, her zaman geçerli saat diliminizin tarihini görürsünüz.


1

Performansı önemsiyorsanız, ISO8601 formatlı tarihlerle işlem yaparken standart Java ayrıştırıcı ve biçimlendiriciden daha iyi performans gösteren bir kütüphane oluşturdum . DatetimeProcessor uygulamaları iş parçacığı açısından güvenlidir ve eşzamanlı bir harita veya statik alanlarda önbelleğe alınabilir.

<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

Tarihten Anında Git'e bir tür basit yol eklemeli ve aynı zamanda toISO8601bir çok insanın aradığı bir yöntem de eklemeliydiler . Bir java.util.Date'den ISO 8601 biçimine kadar diğer yanıtların bir tamamlayıcısı olarak:

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

Otomatik tamamlama kullanılırken gerçekten görünmez, ancak java.time.Instant.toString():

ISO-8601 kullanarak bu anlık bir dize temsili


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

Bu kod soruyu cevaplayabilirken, bu kodun soruyu neden ve / veya nasıl cevapladığı konusunda ek bağlam sağlamak uzun vadeli değerini arttırır.
Vishal Chhodwani

-2

Bunu dene,

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

ISO 8601 formatı için


2
Bu, yanlış saat dilimindeki tarihleri ​​kullanır, Carlos'un cevabına bakın.
Stian Soiland-Reyes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.