2016-12-13 5 views
0

Java時刻がタイムスタンプのような単純なものを処理する方法は、私には少しばかり迷っています。多分私はそれを間違っている。Java時刻の書式の不一致

ISO 8601のタイムスタンプ文字列を生成します。明白な方法はInstance.now()を作成し、フォーマットするにはDateTimeFormatter.ISO_INSTANTを使用してフォーマットします。ただし、Instanceにはformat()というメソッドがないので、「インスタンス」フォーマッタでフォーマットすることはできません。想像してみろ。

したがって、インスタンスからZonedDateTimeを作成する必要があります。今

Instant.now().atZone(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT) 

が、私は戻って、文字列を取得し、明らかに私はそれを取り戻すしたい:それはDateTimeFormatter.ISO_INSTANTはとにかくそれを置くために何が起こっているかですので、私が選ぶ、私はUTCを選択したゾーンは問題ないはずZonedDateTimeインスタンス、それは私がそれをフォーマットするために使用したものですから!だから私は試してみてください:

ZonedDateTime.parse(timestamp, DateTimeFormatter.ISO_INSTANT) 

タイムゾーンの情報がないことを私に訴えます。しかし、私はそれを生成するためにZonedDateTimeを使用しました---それは私がそれをフォーマットするためにInstanceを使用させないという私のせいではありません。

は奇妙Instanceformat()方法を持っていないが、それは、再び奇妙、DateTimeFormatter.ISO_INSTANTを用いて解析されparse()方法を持っている(たとえIできない形式そのフォーマッタを使用Instance)。

コメントで指摘したように、私はDateTimeFormatter.ISO_INSTANT.format(Instance.now())を使用してインスタンスを直接フォーマットすることができます。なぜ、Instance.format(…)が存在しないのですか?

タイムスタンプを生成して解析するだけで、複雑で矛盾しているようです。それとも間違っているのですか?

+1

あなたは 'DateTimeFormatter.ISO_INSTANT.format(...)に' 'Instant'を渡すことができ、あなたのすることはできません:往復は、単にparse()を使用し、このバックを解析するために

? – lexicore

+0

ああ、確かに私はできる!私は 'DateTimeFormatter.format(...)'メソッド全体を見逃していました。それでも、 'Instant'は' DateTimeFormatter.format(...) 'で動作するなら' format(...) 'メソッドを持たないのは奇妙です。そして、もう一つの問題はより大きな矛盾になります。私は 'Instance'をフォーマットするために' DateTimeFormatter.ISO_INSTANCE'を使うことができますが、それを解析することはできません! –

答えて

-1

なぜ文字列を解析するときにフォーマッタを再指定する必要がありますか? ZonedDateTime.parse(timestamp);はできませんか?

2

まず、DateTimeFormatter.ISO_INSTANT.format(Instant.now())とすることができます。

次に、フォーマットした内容を解析する理由がわかりません。書式設定は、無損失操作であるとは限りません。ちょうど年を使ってLocalDateTimeをフォーマットすると、それをLocalDateTimeに解析するとは思わないでしょうか?

もちろん、Instantは、DateTimeFormatter.ISO_INSTANTを使用して解析できます。 DateTimeFormatter.ISO_INSTANT.parse(text, Instant::from) - これはInstant.parse(...)の機能です。

+0

"フォーマットは可逆操作であるとは限りません。"私は一般的な声明として同意し、私は議論になりたくはありませんが、ISO 8601のタイムスタンプ形式に「インスタント」をフォーマットしたとき、私は正確に何を失いましたか?元の「インスタント」を元に戻すために必要な情報は100%持っていませんか? (私はいくつかのコードを使って証明することができます。私の主張である複雑なコードです) –

+0

これらの時間オブジェクトを 'DateTimeFormatter.format(...)'に渡すことができることを思い出してくれてありがとう矛盾。しかし、私が言及した他の多くのものはまだ残っているようです。 –

+0

@GarretWilsonもう一度、 'Instant'をフォーマットしなかったので、あなたは' ZonedDateTime'をフォーマットし、 'ZonedDateTime'でそれを解析しようとしました。それだけでなく、 'DateTimeFormatter.ISO_INSTANT'を解析に使用しました(これはタイムゾーンを失う場所です)。だから私はあなたが「元の「インスタント」を元に戻す」という主張について、どのように議論することができるのか理解していません。なぜなら、これは明らかにコードでやっていることではないからです。 – lexicore

1

はジョブを実行するので、Instantにはformat(DateTimeFormatter)メソッドは必要ありません。 InstanttoString()方法は、次のように実装されます。

return DateTimeFormatter.ISO_INSTANT.format(this); 

このように、あなたがする必要があるすべては、コールinstant.toString()です。

Instant instant = Instant.parse(text);