سؤال

هل هناك طريقة معقولة إلى مجموعة طويلة UTC التواريخ اليوم ؟

أود أن وزارة الدفاع لهم 86400 ولكن لا تأخذ قفزة ثانية في الاعتبار.

هل من أحد لديه أي أفكار أخرى ، أنا باستخدام جافا حتى أتمكن من تحليل لهم في تاريخ الكائنات ، ولكن أنا قلق قليلا من أداء النفقات العامة باستخدام تاريخ الطبقة.

أيضا هناك طريقة أكثر فعالية من مقارنة السنة الشهر اليوم أجزاء من تاريخ الكائن ؟

هل كانت مفيدة؟

المحلول

هل البيانات المصدر <م> بالتأكيد تشمل قفزة ثانية لتبدأ؟ بعض واجهات برمجة التطبيقات القيام به، والبعض الآخر لا - Joda الوقت (الذي أوصى خلال المدمج الوقت / التاريخ واجهات برمجة التطبيقات) <وأ href = "http://joda-time.sourceforge.net/faq.html#leapseconds "يختلط =" نوفولو noreferrer "> لا تستخدم ثانية كبيسة ، على سبيل المثال. التاريخ والوقت جافا واجهات برمجة التطبيقات "أحيانا" تفعل - أنها تدعم 60 و 61 كما قيم "الثاني في الدقيقة" لكن الدعم يعتمد على نظام التشغيل (انظر أدناه). إذا كان لديك بعض القيم عينة جيدة، وأنا سوف تحقق ذلك أولا إذا كنت أنت. من الواضح أن مجرد تقسيم أبسط وليس أي شيء آخر.

إذا <م> لا بحاجة إلى إنشاء كائنات Date (أو DateTime في Joda) وأود أن المؤشر قبل القيام بأي شيء آخر. قد تجد أيضا أن الأداء هو في الواقع كافية تماما. ليس هناك نقطة في إضاعة الوقت الأمثل شيء على ما يرام للبيانات الخاصة بك. بطبيعة الحال، سوف تحتاج إلى أن تقرر حجم البيانات التي تحتاج إلى دعم، وكيف سريع فإنه يجب أن يكون أولا:)

وحتى الدعم java.util.Date لقفزة ثانية هو غير محدد إلى حد ما. من مستندات :

<اقتباس فقرة>   

وعلى الرغم من أن المقصود من تاريخ الطبقة ل   تعكس التوقيت العالمي المنسق   (UTC)، قد لا تفعل ذلك بالضبط،   اعتمادا على البيئة مجموعة من   آلة جافا الافتراضية. جميعهم تقريبا   تفترض أنظمة التشغيل الحديثة أن 1   يوم = 24 × 60 × 60 = 86400 ثانية في   جميع الحالات. في UTC، ومع ذلك، مرة واحدة   كل سنة أو سنتين هناك مبلغ إضافي   الثانية، ودعا الى "قفزة ثانية." ال   دائما بإضافة قفزة الثانية باسم   الثانية الأخيرة من اليوم، ودائما على   31 ديسمبر أو 30. يونيو على سبيل المثال،   وكانت الدقيقة الأخيرة من سنة 1995   61 ثواني طويلة، وذلك بفضل وأضاف   قفزة الثانية. معظم الساعات الكمبيوتر هي   لا دقيقة بما فيه الكفاية لتكون قادرة على   تعكس التمييز ثانية كبيسة.

وهناك جيدة نوعا آخر بلوق حول الفوضى مع جافا وقفزة ثانية التي قد ترغب في قراءة للغاية.

نصائح أخرى

<اقتباس فقرة>   

وأود أن وزارة الدفاع لهم من قبل 86400 ولكن لا تأخذ قفزة ثانية في الاعتبار ....

وأنا متأكد من أن ذلك سيكون على ما يرام. لا ينبغي أن تتضمن الوثائق API لDate حقا أي شيء عن قفزة ثانية، لأن الحقيقة هي أنه يحاكي معيار الوقت شريط يونكس التي لا تتضمن قفزة ثانية في قيمتها. ماذا يفعل بدلا من ذلك هو أن تكون الثانية ال59 الذي يستمر لمدة ثانيتين عن طريق تحديد قيمة مؤشر إلى الوراء 1 ثانية في بداية ثانية كبيسة (كحلقة وصل في الوظيفة السابقة يصف).

لذلك يمكنك أن تفترض أن القيمة التي تحصل عليها من Date.getTime() تتكون فقط من أيام 86400 ثانية. إذا كنت حقا بحاجة إلى معرفة ما إذا كان <م> خاص اليوم كان نقلة الثانية، وهناك العديد من الجداول المتاحة على شبكة الإنترنت (لم يكن هناك سوى 23-24 منذ عام 1972، وتواريخ الكمبيوتر قبل أن نادرا ما اقتادوهم إلى حساب على أي حال).

وHIH

ونستون

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.نفس اللحظة قد يكون هناك تاريخ سابق في كيبيك أو موعد في وقت لاحق في أوكلاند, نيوزيلندا.

منطقة زمنية حاسمة في تحديد موعد سؤالك يتجاهل هذه المسألة.

باستخدام جافا.الوقت

على java.util.Date الفئة هي جزء من مزعجة القديم التاريخ-الوقت الطبقات التي هي الآن ميراث قبل محل جافا.الوقت الطبقات.

أما بالنسبة قفزة ثانية ، إجابات أخرى اقترح معظم مصادر العد من عصر تفعل لا عد قفزة ثانية.لذلك التحقق من المصدر.

إذا كان لديك حساب من كل ثانية من عصر 1970-01-01T00:00:00, ثم استخدام أسلوب ثابت لإنشاء Instant الكائن.

Instant instant = Instant.ofEpochSecond( 1_493_367_302L ) ;

الفورية.toString():2017-04-28T08:15:02Z

تعيين المنطقة الزمنية لخلق السياق الذي يمكننا تحديد موعد.في أي لحظة ، تاريخ يختلف في جميع أنحاء العالم من قبل المنطقة.

تحديد الوقت المناسب اسم المنطقة في شكل 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 [/أمريكا Los_Angeles]

مع مجموعة من هذه ZonedDateDate الأجسام ، يمكنك مقارنة التاريخ.يمكنك استخراج LocalDate الكائن.على LocalDate تمثل الطبقة تاريخ فقط قيمة دون وقت من اليوم وبدون المنطقة الزمنية.

LocalDate ld = zdt.toLocalDate();

ld.toString():2017-04-28

إذا كنت يمكن أن تجعل Map مع LocalDate كما المفتاح ، List أو Set من ZonedDateTime الأشياء القيمة.و مع الحديث امدا الجملة, هل يمكن استخدام تيارات فعل ذلك رسم الخرائط.


حول جافا.الوقت

على java.الوقت إطار بنيت في جاوة 8 وما بعدها.هذه الفئات محل مزعجة القديمة تراث التاريخ الوقت الطبقات مثل java.util.Date, Calendar, & SimpleDateFormat.

على Joda الوقت المشروع الآن في وضع الصيانة, تنصح الهجرة إلى java.الوقت فصول.

لمعرفة المزيد ، راجع أوراكل التعليمي.والبحث تجاوز سعة مكدس على العديد من الأمثلة و الشروح.مواصفات JSR 310.

أين يمكن الحصول على جافا.الوقت الطبقات ؟

على ThreeTen إضافية المشروع يمتد جافا.الوقت مع فصول إضافية.هذا المشروع هو إثبات أن من الممكن في المستقبل الإضافات جافا.الوقت.قد تجد بعض المعلومات المفيدة في هذه الطبقات هنا مثل Interval, YearWeek, YearQuarter, ، المزيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top