2009-03-24 19 views
3

長いUTC日付を日単位でグループ分けする賢明な方法はありますか?長いUTC日付を日単位でグループ化する

私は86400でそれらをModしますが、閏秒を考慮に入れません。

他にもアイデアがある人はいますか?私はJavaを使用しているため、日付オブジェクトにそれらを解析できますが、日付クラスを使用するとパフォーマンスオーバーヘッドが少し心配です。

また、Dateオブジェクトの年月部分と日部分を比較するより効率的な方法がありますか?

答えて

3

ソースデータは間違いなくには閏秒が含まれていますか?いくつかのAPIはありますが、いくつかのAPIはありません。例えば、Joda Time(組み込みの日付/時刻APIよりもお勧めします)doesn't use leap secondsです。 Javaの日時APIは「時には」実行されます。「秒単位」の値として60と61をサポートしていますが、サポートはオペレーティングシステムによって異なります(下記参照)。あなたが良いサンプル値を持っているなら、私があなたであればまずそれをチェックします。明らかに分割するだけで、何よりも簡単です。私が何かを行う前に、ベンチマークを希望

あなたがDateオブジェクトを作成する必要性を行う場合(またはジョダでDateTime)。パフォーマンスが実際には完全に適切であることがわかります。あなたのデータに妥当なものを最適化する時間を無駄にすることには意味がありません。もちろん、サポートする必要のあるデータサイズと、最初にすばやく必要なデータサイズを決定する必要があります。

閏秒のサポートもやや不確定です。 the docsから:

Dateクラスが に意図されているが、ユニバーサル時間 (UTC)をコーディネート反映、それは Java仮想マシンのホスト環境に依存するので、正確に をしないことがあります。ほぼすべて 最新のオペレーティングシステムは、1 日= 24×60×60 = 86400秒であると仮定して、すべてのケースを とします。ただし、UTCでは、毎年約1回または2回、 があり、「うるう秒」と呼ばれる余分な があります。 うるう秒は常にその日の 最後の秒として追加され、常に12月31日または6月30日 に例えば、1995年の 最後の分は、追加 うるう秒のおかげで 61秒長かったです。ほとんどのコンピュータの時計は であり、十分に正確ではないため、 には閏秒の区別が反映されています。

rather good blog postには、Javaと閏秒が混在していて、読んでみてください。

3

私は86400でそれらをMODだろうが、それを考慮にうるう秒を取ることはありません....

私はそれは大丈夫だろうことを確信しています。 DateのAPIドキュメントには、うるう秒を値に含めない標準のUnixタイムティッカーをエミュレートするため、実際にはうるう秒については何も含めてはいけません。 代わりに、うるう秒の開始時にティッカー値を1秒戻して(前の記事のリンクが説明しているように)59秒を2秒間持続させることです。

したがって、Date.getTime() ISから得られる値は、86400秒の間だけであると仮定できます。 特に日にうるう秒があるかどうかを本当に知る必要がある場合は、インターネット上で利用できるいくつかのテーブルがあります(1972年以来23-24しかありませんでした。

HIH

ウィンストン

0

TL; DR

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クラスを使用して

はjava.timeクラスに取って代わら今レガシーあり面倒古い日付時刻クラスの一部です。

他の回答が示唆しているように、エポックからのカウントのほとんどのソースはではなく、カウント閏秒です。だからあなたの出所を確認してください。

エポックからの秒数が1970-01-01T00:00:00の場合は、staticメソッドを使用してInstantオブジェクトを作成します。

Instant instant = Instant.ofEpochSecond(1_493_367_302L) ; 

instant.toString():2017-04-28T08:15:02Z

は、我々は、日付を決定することができるコンテキストを作成するための時間帯を割り当てます。任意の瞬間について、日付はゾーンごとに世界中で異なります。

は、America/MontrealAfrica/Casablanca、又はPacific/Aucklandとして、continent/regionの形式でproper time zone nameを指定します。 ESTまたはISTのような3〜4文字の略語は、ではなく、で、標準化されておらず、ユニークではありません(!)ので絶対に使用しないでください。

ZoneId z = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(z); 

zdt.toString():2017-04-28T01:15:02-07:00 [アメリカ/ Los_Angeles]

これらZonedDateDateオブジェクトの束のことで、あなたは比較することができます日付によって。 LocalDateオブジェクトを抽出することができます。 LocalDateクラスは、時間帯のない時間帯のない日付のみの値を表します。

LocalDate ld = zdt.toLocalDate(); 

LD。toString():2017年4月28日

ですから、値としてキーとZonedDateTimeオブジェクトのListまたはSetとしてLocalDateMapを作ることができます。現代のラムダ構文では、Streamsを使用してそのマッピングを行うことができます。 java.timeについて


java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古いlegacy日時クラスなどjava.util.DateCalendar、& SimpleDateFormatに取って代わります。

maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8Java SE 9、以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6Java SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
      ThreeTenABP
    • プロジェクトは、具体的にはAndroid用(上記)ThreeTen-バックポートを適応させます。
    • How to use ThreeTenABP…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

関連する問題