質問
長い UTC 日付を日ごとにグループ化する賢明な方法はありますか?
私なら 86400 までに変更しますが、これにはうるう秒は考慮されていません。
誰か他のアイデアはありますか。私はJavaを使用しているので、日付オブジェクトに解析できますが、日付クラスを使用することによるパフォーマンスのオーバーヘッドが少し心配です。
また、Date オブジェクトの年月日の部分を比較するより効率的な方法はありますか?
解決
ソース・データの間違いのうるう秒で起動する含まれていますか?一部のAPIが行う、といくつかはしないでください - (私は内蔵の日付/時刻のAPIを介してお勧めします)ジョダ時間<のhref = "http://joda-time.sourceforge.net/faq.html#leapseconds "RELは=" nofollowをnoreferrer ">例えば、うるう秒を使用していません。 Javaの日付と時刻のAPIが「時々」やる - (下記参照)彼らは「分における第二」の値として60と61をサポートしますが、サポートは、オペレーティング・システムによって異なります。あなたには、いくつかの良いサンプル値を持っている場合は、私があなただったら、私はその最初のを確認したいです。もちろん、単に割る何か他のものよりもかなり簡単です。
は、がはDate
オブジェクトを作成する必要がある場合(またはジョダでDateTime
)私はベンチマークだろう、それ何かを行う前に。あなたも、パフォーマンスが実際に完全に適切であることを見つけることがあります。あなたのデータのために大丈夫です何かを最適化し、時間を無駄にはポイントはありません。もちろん、あなたがデータのサポートする必要がある大きさ、そしてどのように迅速にそれが最初にする必要がありますを決定する必要があります)。
うるう秒でもjava.util.Date
のサポートはやや不確定です。ドキュメントはをます:
についてDateクラスはに意図されているが 協定世界時間を反映 (UTC)、それはまさにそうしないことがあり、 のホスト環境に応じて、 Java仮想マシン。ほとんど 最近のオペレーティングシステムは、1と仮定します 日= 24×60×60 = 86400秒 すべてのケース。 UTCには、しかし、一回程度 毎年または2つの余分があります 二、「うるう秒」と呼ばザ・ うるう秒は、いつものように追加されます 最終日の第二、および常にオン たとえば、12月31日または6月30日、 1995年の最後の分でした 長い61秒、追加のおかげで うるう秒。ほとんどのコンピュータのクロックは、 できるようにするには十分に正確ではありません うるう秒の違いを反映している。
他のヒント
私は86400でそれらをMODだろうが、それを考慮にうるう秒を取ることはありません....
私はそれは大丈夫だろうことを確信しています。事実は、それがその値にうるう秒が含まれていない標準のUnixタイムティッカーをエミュレートすることであるので、本当にDate
のAPIドキュメントは、うるう秒については何も含めるべきではありません。
何それが代わりに行うことは(以前の記事でリンクが記述するように)うるう秒の開始時に1秒でバックティッカー値を設定することにより、2秒間持続59秒を持つことです。
そのため、あなたがDate.getTime()
から取得した値のみ86400秒の日で構成されていると仮定することができます。あなたは本当に、の特定のの日はうるう秒を持っていた、インターネット上で利用可能ないくつかのテーブルが(のみ1972年以来23-24そこがあったされているかどうか、そしてそれはめったににそれらを取っていないコンピュータの日付の前に知っておく必要がある場合)とにかく占めます。
HIH
ウィンストン
先生
Instant.ofEpochSecond( 1_493_367_302L ) // Convert a count of whole seconds from epoch of 1970 into a date-time value in UTC.
.atZone( ZoneId.of( "Pacific/Auckland" ) ) // Adjust into the time zone as a context for determining a date.
.toLocalDate() // Extract a date-only value by which we can sort/collect/organize our date-time values.
タイムゾーン
の java.util.Date
クラスはタイムライン上の瞬間を UTC で表します。したがって、日付を尋ねると、UTC でのみ意味をなす日付が得られます。その同じ瞬間は、それ以前のケベック州での日付である可能性もあれば、その後のニュージーランドのオークランドでの日付である可能性もあります。
タイムゾーンは日付を決定する際に重要ですが、あなたの質問ではこの問題が無視されています。
java.timeの使用
の java.util.Date
class は、現在はレガシーとなっており、java.time クラスに取って代わられた、厄介な古い日付/時刻クラスの一部です。
うるう秒に関しては、他の回答が示唆しているように、エポックからのカウントのほとんどのソースは ない 閏秒を数えます。したがって、ソースを確認してください。
エポックからの整数秒数をカウントしている場合、 1970-01-01T00:00:00
, 次に、静的メソッドを使用して Instant
物体。
Instant instant = Instant.ofEpochSecond( 1_493_367_302L ) ;
instant.toString():04/28/2017 08:15:02
タイムゾーンを割り当てて、日付を決定できるコンテキストを作成します。特定の瞬間において、日付はゾーンごとに世界中で異なります。
を指定してください 適切なタイムゾーン名 の形式で continent/region
, 、 のような America/Montreal
, Africa/Casablanca
, 、 または Pacific/Auckland
. 。次のような 3 ~ 4 文字の略語は決して使用しないでください。 EST
または IST
彼らはあるとして ない 本当のタイムゾーンは標準化されておらず、一意でもありません(!)。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString():2017-04-28T01:15:02-07:00[アメリカ/ロサンゼルス]
これらの束で ZonedDateDate
オブジェクトを日付で比較できます。抽出することができます LocalDate
物体。の LocalDate
class は、時刻やタイムゾーンを含まない日付のみの値を表します。
LocalDate ld = zdt.toLocalDate();
ld.toString():2017-04-28
それで、あなたは作ることができます Map
と LocalDate
キーとして、そして List
または Set
の ZonedDateTime
オブジェクトを値として扱います。そして、最新のラムダ構文を使用すると、ストリームを使用してそのマッピングを行うことができます。
java.timeについて
の java.time フレームワークは Java 8 以降に組み込まれています。これらのクラスは、面倒な古いクラスに取って代わります。 遺産 日時クラスなど java.util.Date
, Calendar
, & SimpleDateFormat
.
の ジョーダタイム プロジェクト、現在進行中 メンテナンスモード, への移行をアドバイスします。 java.time クラス。
詳細については、を参照してください。 オラクルのチュートリアル. 。また、Stack Overflow で検索すると、多くの例や説明が得られます。仕様は JSR 310.
java.time クラスはどこで入手できますか?
- Java SE8, Java SE9, 、 以降
- 内蔵。
- 実装がバンドルされている標準 Java API の一部。
- Java 9 では、いくつかのマイナーな機能と修正が追加されています。
- Java SE6 そして Java SE 7
- java.time 機能の多くは、Java 6 および 7 にバックポートされています。 ThreeTen バックポート.
- アンドロイド
- の スリーテンABP プロジェクトが適応する ThreeTen バックポート (前述) 特に Android の場合。
- 見る ThreeTenABPの使い方….
の ThreeTen-Extra プロジェクトは追加のクラスで java.time を拡張します。このプロジェクトは、将来 java.time に追加される可能性があるための実験場です。ここで次のような便利なクラスを見つけることができます。 Interval
, YearWeek
, YearQuarter
, 、 そして もっと.