現在の瞬間、UTCのISO 8601形式のプレゼンテーションを取得する最もエレガントな方法は何ですか?次のようになります2010-10-12T08:50Z
。
例:
String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);
private static SimpleDateFormat
スレッドセーフではないことに注意してください。
現在の瞬間、UTCのISO 8601形式のプレゼンテーションを取得する最もエレガントな方法は何ですか?次のようになります2010-10-12T08:50Z
。
例:
String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);
private static SimpleDateFormat
スレッドセーフではないことに注意してください。
回答:
使用SimpleDateFormat
して、必要な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()
上記のようにa を使用すると、現在の時刻がフォーマットされます。
"yyyy-MM-dd'T'HH:mmZ"
、ISO-8601形式の日付が必要になるたびに、アプリケーションに多くのインスタンスが必要になることです。私が見るようJodaTimeで、私は事前に定義されたフォーマッタを使用することができますISODateTimeFormat
...私のためにこの仕事をして、
Z
はSimpleDateFormatの有効なパターンであり、次のようにしyyyy-MM-dd'T'HH:mm'Z'
ます。
デフォルトのタイムゾーンが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());
の SimpleDateFormat
インスタンスが頻繁に必要に応じて、グローバル定数として宣言されますが、このクラスはスレッドセーフではないことを注意してくださいすることができます。複数のスレッドが同時にアクセスする場合は、同期する必要があります。
編集:多くの異なる時刻/日付操作を行う場合は、Joda Timeを使用します...
EDIT2:修正済み:setTimeZone
文字列を受け入れません(Paulによって修正済み)
2016-06-14T13:56+0000
-質問は次のようなものを求めています2016-06-14T13:56Z
java.timeを使用すると、Java 8以降でスレッドが安全になります。
ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )
結果: 2015-04-14T11:07:36.639Z
または
Temporal
などのライターを使用したくなるかもしれませんが、フォーマッタのサポートやタイムゾーンデータが不足しています。箱から出しただけで動作します。Instant
LocalDateTime
ZonedDateTime
ZonedDateTimeおよびDateTimeFormatterのオプション/操作を調整またはチェーンすることにより、タイムゾーンと精度をある程度まで簡単に制御できます。
ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
.truncatedTo( ChronoUnit.MINUTES )
.format( DateTimeFormatter.ISO_DATE_TIME )
結果: 2015-04-14T11:07:00+01:00[Europe/Paris]
秒の部分の削除などの洗練された要件は、カスタム形式またはカスタム後処理によって提供される必要があります。
.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および7の場合は、Androidポートも備えたThreeTen-Backportなどのjava.timeのバックポートを検討してください。どちらもJodaよりも軽量で、Jodaの経験から学んでいます。java.timeはJodaの作者が設計したと考えてください。
ZoneId.of( "America/Montreal" )
。
return DateTimeFormatter.ISO_INSTANT.format(this);
DateTimeFormatter.ISO_INSTANT
してDateTimeFormatter.ISO_DATE_TIME
使用します。これは、Springでもはや取得されない3桁ではありません@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
。
Java 8:
thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX")
.withZone(ZoneOffset.UTC)
.format(Instant.now());
Java 8より前:
thisMoment = String.format("%tFT%<tRZ",
Calendar.getInstance(TimeZone.getTimeZone("Z")));
ドキュメントから:
'R'
'F'
"%tH :%tM"として24時間形式でフォーマットされた時刻ISO 8601完全な日付は "%tY-%tm-%td"としてフォーマットされます。
DateTime dt = new DateTime(); DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); String str = fmt.print(dt);
、またはカプセル化します。return String.format("%tFT%<tRZ", new Date());
クラスに、そしてstr = Iso8601Time.now()
あなたがそれを必要とするところはどこでもそうしなさい。(ISO形式が変更されるようなわけではありません。)ISO形式の現在の日付だけでなく、他にも必要なことが判明した場合は、libを使用してください。
%tFT%<tTZ
秒が含まれます。%tFT%<tTZ.%<tL
ミリ秒が含まれます。
Java 8以降では、次のように簡単に実行できます。
Instant.now().toString();
java.time.Instant
ドキュメントから:
今
public static Instant now()
システムクロックから現在のインスタントを取得します。
これにより、システムのUTCクロックが照会され、現在の瞬間が取得されます。
public String toString()
ISO-8601表現を使用したこのインスタントの文字列表現。
使用される形式はと同じ
DateTimeFormatter.ISO_INSTANT
です。
SimpleDateFormats
。
toString
、多くの場合、明示的に呼び出す必要すらありません。
JodaTimeを使用する
ISO 8601カレンダーシステムは、Joda-Time内のデフォルトの実装です
ここにがJodaTime Formatterのドキュメントです
編集:
追加したくない場合、または上記のライブラリを追加する価値がない場合は、ビルド済みで使用できます SimpleDateFormat
クラスで日付を必要なISO形式にフォーマットするます。
@Joachim Sauerの提案どおり
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());
ISODateTimeFormat
、ISO-8601の事前定義されたフォーマッターを備えているため、いずれの場合も優れています。
ApacheのDateFormatUtilsには、次のcommons-lang3
ような便利な定数があります。DateFormatUtils.ISO_DATETIME_FORMAT
DateFormatUtils.format(new Date(), "yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"));
現在の瞬間:デフォルトのタイムゾーンでの現在の瞬間:DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date())
; @ yegor256について言及していただきありがとうございます。apachecommons DateFormatUtils
-langを搭載しているため、日付形式を使用する価値があります。
ISO 8601には秒が含まれる場合があります。 http://en.wikipedia.org/wiki/ISO_8601#Timesを
したがって、コードは
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
更新:ジョダタイムプロジェクトは、今でメンテナンスモードへの移行を助言チームと、java.timeのクラス。Javaの6&7は、以下を参照してくださいThreeTen-バックポートのさらなるでアンドロイドに適合したプロジェクト、ThreeTenABPのプロジェクトを。
Joda-Timeライブラリを使用しています…
String output = new DateTime( DateTimeZone.UTC ).toString() ;
これはスレッドセーフです。Joda-Timeは新しい不変オブジェクトを作成しますは、既存のオブジェクトを変更するのではなく、ます。
本当に秒単位のないフォーマットを要求し、分単位に解決するつもりなら、Joda-Timeの他の多くの組み込みフォーマッターの1つを使用してください。
DateTime now = new DateTime( DateTimeZone.UTC ) ;
String output = ISODateTimeFormat.dateHourMinute.print( now ) ;
Java 8以降では、Joda-Timeは引き続き機能します。しかし、組み込みのjava.timeフレームワーク -Timeに取って代わりました。したがって、コードをJoda-Timeからjava.timeにできるだけ早く移行してください。
最新のソリューションについては、他の回答を参照してください。
java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスjava.util.Date
、Calendar
&を、SimpleDateFormat
。
ジョダタイム今ではプロジェクト、メンテナンスモードでは、への移行をアドバイスjava.timeクラス。
詳細については、Oracleチュートリアルを参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。
java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*
java.timeクラスはどこで入手できますか?
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。
Javaバージョン7の場合
Oracleのドキュメントに従ってください:http : //docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
X-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);
ISO 8601の場合、JavaのSimpleDateFormatを次のパターンyyyy-MM-dd'T'HH:mm:ssXXX
で使用できます。
サンプルコード:(使用可能なすべてのタイムゾーンのリスト)
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();
}
あなたは使うことができます:
TimeZone.getDefault()
デフォルトのvmタイムゾーン。詳細はこちら
で終わるいくつかのタイムゾーンの日付時刻に気付く場合があります'Z'
。これらのタイムゾーンには、'0'
GMTからの。
詳細については、こちらをご覧ください。
私は、最も簡単な方法は、最初にインスタントに移動し、次に次のようにひもでつなぐことだと信じています。
String d = new Date().toInstant().toString();
その結果:
2017-09-08T12:56:45.331Z
Date
場合は、昔ながらのオブジェクトを経由する必要はありません。ただしてくださいInstant.now().toString()
。Date
レガシーAPIからを取得した場合、あなたのメソッドが最適です。
java.util.Date
、java.util.Calendar
とjava.text.SimpleDateFormat
今のレガシーに取って代わられ、java.timeの後にJavaの8とに組み込まれたクラス。Oracleによるチュートリアルを参照してください。
他の回答のいくつかはjava.timeクラスを推奨するのに正しいですが、特定のニーズに合わせて不必要な長さを使用します。
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.Instant
クラスは、ある瞬間をUTCで表し、常にUTCで表します。
Instant instant = Instant.now() ;
instant.toString():2018-01-23T12:34:56.123456Z
Z
あなたの例の文字列の末尾には2010-10-12T08:50Z
「ズールー」と発音される手段UTC。
あなたの望ましいフォーマットはたまたま準拠しています ISO 8601標準ます。java.timeの文字列を生成/解析するときのクラスは、デフォルトでは、これらの標準フォーマットを使用します。したがって、フォーマットパターンを指定する必要はありません。電話するだけInstant::toString
上記のようにてください。
特に、秒なしの分全体または小数秒が必要な場合は、切り捨てます。ChronoUnit
クラスを介して時間の単位を指定します。
Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ;
String output = instant.toString(); // Generate a `String` object in standard ISO 8601 format.
java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、などの厄介な古いレガシー日時クラスに取って代わりますjava.util.Date
。Calendar
&を、SimpleDateFormat
。
ジョダタイム今ではプロジェクト、メンテナンスモードへの移行をアドバイスjava.timeのクラス。
詳細については、Oracleチュートリアルを参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。
java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*
java.timeクラスはどこで入手できますか?
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。
以下は、「now()」を呼び出しても何も実行しないように最適化されたクラス全体です。
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());
}
それでも、joda-timeは拡張フォーマット "2015-12-09T00:22:42.930Z"のみをサポートしています。基本ではありません: "20151209T002242.930Z" ... Java SimpleDateFormatを使用してフォーマットのリストをテストした方がよい場合があります。
私はカレンダーとSimpleDateFormatを使用してAndroidでそれを行いました。次のメソッドは、 "GMT" TimeZoneを持つカレンダーを返します(これは世界標準のタイムゾーンです)。次に、CalendarクラスのメソッドsetTimeZone()を使用して、Calendarクラスを使用して異なるタイムゾーン間の時間を設定できます。
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;
}
注意:DateクラスはTimeZoneの存在を認識していません。このため、1つの日付をデバッグすると、常に現在のタイムゾーンの日付が表示されます。
パフォーマンスに関心がある場合は、ISO8601形式の日付を操作する際に、標準のJavaパーサーおよびフォーマッターよりも優れたライブラリを作成しました。DatetimeProcessorの実装はスレッドセーフであり、並行マップまたは静的フィールドにキャッシュできます。
<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"));
}
}
彼らは、日付からインスタントに移動するためのある種の簡単な方法とtoISO8601
、多くの人が探していると呼ばれるメソッドを追加する必要がありました。java.util.DateからISO 8601形式への他の回答の補足として:
Instant.ofEpochMilli(date.getTime()).toString();
オートコンプリートを使用する場合は実際には表示されませんが、次のようになります
java.time.Instant.toString()
。
ISO-8601を使用したこのインスタントの文字列表現
DateTimeFormatter.ISO_DATE_TIME
.withZone(ZoneOffset.UTC)
.format(yourDateObject.toInstant())
これを試して、
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ");
String date=sdf.format (new Date() );
ISO 8601形式の場合