質問

長い 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秒、追加のおかげで   うるう秒。ほとんどのコンピュータのクロックは、   できるようにするには十分に正確ではありません   うるう秒の違いを反映している。

かなり良いブログの記事あなたも読むことをお勧めします、Javaとうるう秒と混乱ます。

について

他のヒント

  

私は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

それで、あなたは作ることができます MapLocalDate キーとして、そして List または SetZonedDateTime オブジェクトを値として扱います。そして、最新のラムダ構文を使用すると、ストリームを使用してそのマッピングを行うことができます。


java.timeについて

java.time フレームワークは Java 8 以降に組み込まれています。これらのクラスは、面倒な古いクラスに取って代わります。 遺産 日時クラスなど java.util.Date, Calendar, & SimpleDateFormat.

ジョーダタイム プロジェクト、現在進行中 メンテナンスモード, への移行をアドバイスします。 java.time クラス。

詳細については、を参照してください。 オラクルのチュートリアル. 。また、Stack Overflow で検索すると、多くの例や説明が得られます。仕様は JSR 310.

java.time クラスはどこで入手できますか?

ThreeTen-Extra プロジェクトは追加のクラスで java.time を拡張します。このプロジェクトは、将来 java.time に追加される可能性があるための実験場です。ここで次のような便利なクラスを見つけることができます。 Interval, YearWeek, YearQuarter, 、 そして もっと.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top