2015-09-15 5 views
10

क्या कोई समय/दिनांक समय बनाने के लिए जोडाटाइम में कोई तरीका है जो हमेशा किसी अन्य दिनांक/दिनांक समय से छोटा/बड़ा होगा?जोडाटाइम में न्यूनतम/अधिकतम तिथि/दिनांक समय

DateTime bigBang = DateTime.xxx(); 
DateTime endOfUniverse = DateTime.yyy(); 

बाधाओं के साथ कुछ मानक: मैं मानक जावा दिनांक पुस्तकालयों का उपयोग नहीं करना चाहता हूं।

+1

मुझे लगता है कि 'नया डेटटाइम (0)' आपको न्यूनतम 'डेटटाइम' देगा जिसका प्रतिनिधित्व किया जा सकता है। बस एक जंगली अनुमान है, लेकिन हो सकता है कि 'लंबा' का अधिकतम मूल्य अधिकतम होगा? –

+2

जावा 8 के साथ, यह बस ['LocalDateTime.MAX'] है (https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#MAX) (resp। MIN) – Tunaki

+0

@TheodorosChatzigiannakis 0 01/01/1970 दे देंगे। आप अतीत में नकारात्मक मूल्यों के साथ निश्चित रूप से आगे जा सकते हैं। हालांकि, दिनांक-समय के लिए MIN_VALUE और MAX_VALUE वैध मान मान्य नहीं हैं। वे तत्काल के लिए ठीक हैं। –

उत्तर

8

java.time

जोडा-टाइम प्रोजेक्ट अब रखरखाव मोड में है। टीम जावा.टाइम कक्षाओं में माइग्रेशन की सलाह देती है।

जावा/टाइम में न्यूनतम/अधिकतम के लिए, इसी तरह के प्रश्न पर my Answer देखें।

Joda समय

Joda-Time पटरियों समय UTC में 1970 के पहले पल की अवधि के बाद milliseconds की गिनती के रूप में। यह गणना 64-bitlong पूर्णांक का उपयोग करके रखी जाती है। इसलिए, तकनीकी रूप से, अधिकतम और न्यूनतम +12- long की सीमाएं हैं।

… new DateTime(Long.MIN_VALUE) 
… new DateTime(Long.MAX_VALUE) 

जोडा-टाइम में स्थिरांक के रूप में आसानी से उपलब्ध न्यूनतम/अधिकतम मूल्य नहीं हैं। इसके विपरीत, ध्यान दें कि जोडा-टाइम के उत्तराधिकारी, java.time जावा 8 और बाद में निर्मित, वास्तव में स्थिरांक LocalDateTime.MIN और LocalDateTime.MAX प्रदान करते हैं।

वैसे, जोडा-टाइम टीम ने सलाह दी है कि हमें जावा.टाइम में माइग्रेट करना चाहिए। जावा की अधिकांश कार्यक्षमता जावा 12 & 7 को ThreeTen-Backport में बैक-पोर्ट किया गया है, और ThreeTen-ABP में एंड्रॉइड को अनुकूलित किया गया है।

, बहुत बड़ा बहुत छोटा

इन चरम सीमाओं से सावधान रहें। उनका उपयोग व्यावहारिक नहीं है। विभिन्न पुस्तकालयों, ऐप्स, डेटाबेस, और अन्य सिंक/डेट-टाइम मानों के स्रोतों में बहुत अलग सीमाएं हो सकती हैं, कुछ बहुत बड़ी लेकिन आमतौर पर बहुत छोटी होती है।

उदाहरण के लिए, कई प्रणालियों UNIX & से पुरानी परंपरा का उपयोग 1 9 70-01-010000: 00: 00Z के बाद से पूरे सेकंड की 32-बिट पूर्णांक गणना के रूप में ट्रैकिंग समय के POSIX। +/- दो अरब सेकंड की प्राकृतिक सीमा Year 2038 Problem लूमिंग में परिणाम देती है।

एक और सीमा फॉर्म और रिपोर्ट पर फ़ील्ड का भौतिक प्रदर्शन आकार है जो सालाना संख्या में केवल चार अंक की अपेक्षा करता है।

वर्कअराउंड

आप अपना स्वयं का न्यूनतम/अधिकतम परिभाषित कर सकते हैं।

आप 0000 और वर्ष 99 99 जैसे चरम मूल्यों को प्राप्त कर सकते हैं। जोडा-टाइम 9, 999 से साल बाद का समर्थन करता है लेकिन मैं स्क्रीन पर और रिपोर्ट में प्रदर्शित होने के लिए सामान्य रूप से प्रयुक्त प्रारूपों को फिट करने के लिए 4 अंकों के साथ रहूंगा। दृश्यमान रूप से, चार नाइन एक फर्जी तारीख के रूप में बाहर खड़े हैं।

या आप अपने व्यापार तर्क के लिए अपेक्षित न्यूनतम अनुमानित मूल्य चाहते हैं। यदि एक नई चालान प्रणाली तैयार कर रही है, तो आप जानते हैं कि वर्ष हमेशा इस वर्ष या बाद में होना चाहिए।

मैं एक सहायक वर्ग पर स्थिरांक को परिभाषित करने का सुझाव देता हूं। कुछ इस तरह:

package com.example; 

import org.joda.time.DateTime; 
import org.joda.time.DateTimeZone; 

public class JodaTimeHelper { 

    static final public DateTime START_OF_TIME = new DateTime(0000, 1, 1, 0, 0, 0, DateTimeZone.UTC); 
    static final public DateTime END_OF_TIME = new DateTime(9999, 1, 1, 0, 0, 0, DateTimeZone.UTC); 

    static final public DateTime MINIMUM_INVOICE_DATETIME = new DateTime(2015, 1, 1, 0, 0, 0, DateTimeZone.UTC); 

} 

यहाँ उन स्थिरांक फोन करने के लिए वाक्य रचना है।

System.out.println("START_OF_TIME: " + JodaTimeHelper.START_OF_TIME); 
System.out.println("END_OF_TIME: " + JodaTimeHelper.END_OF_TIME); 
System.out.println("END_OF_TIME: " + JodaTimeHelper. MINIMUM_INVOICE_DATETIME); 

रन करते समय।

START_OF_TIME: 0000-01-01T00:00:00.000Z 
END_OF_TIME: 9999-01-01T00:00:00.000Z 
MINIMUM_INVOICE_DATETIME: 2015-01-01T00:00:00.000Z 
+1

बस एक साइड नोट, जोडाटाइम द्वारा समर्थित चरम न्यूनतम/अधिकतम तिथियां: नई डेटटाइम (Long.MIN_VALUE); नया डेटटाइम (Long.MAX_VALUE); –

2

जब सभी तिथियां एक ही समय क्षेत्र में हैं, तो आप DateTime ऑब्जेक्ट को न्यूनतम या अधिकतम मान के लिए निर्दिष्ट फ़ील्ड के साथ बना सकते हैं।
लेकिन जब Years.MAX_VALUE.getYears() के साथ इस निर्माता

DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute) 

का उपयोग कर रहा अपवाद नीचे है:

enter image description here

तो अपवाद से साल की अधिकतम संख्या का उपयोग कर, मैं निम्नलिखित अंत के साथ आया है -universe dateTime:

DateTime dtMax = new DateTime(292278993, 12, 31, 23, 59, 59); 
System.out.println(dtMax); 
// prints 292278993-12-31T23:59:59 

अधिक घ के लिए देखें documentation etails।
भी एक दिलचस्प चर्चा here पढ़ा जा सकता है।

+0

यह इस्तेमाल क्रोनोलॉजी पर निर्भर करता है। कॉप्टिक क्रोनोलॉजी में, अधिकतम वर्ष 2 9 2272708 – Tunaki

+0

उपरोक्त उदाहरण में ISOChronology का उपयोग किया जाता है। – MaxZoom

0

इस पर विभिन्न स्पर्शरेखा के बहुत सारे के माध्यम से पढ़ने के बाद, मैं अंत में एक न्यूनतम मामला है कि दोनों न्यूनतम और UTC समय क्षेत्र के लिए अधिकतम के लिए काम करता यह पता लगाने का फैसला किया। और यह पता चला है कि Long के MIN_VALUE और MAX_VALUE का उपयोग करने का प्रयास करने से मुझे खरगोश के निशान नीचे भेज दें।

तो, निम्नलिखित कोड का टुकड़ा दिया:

UTC_DATE_TIME_MIN_VALUE_IN_MILLIS = 9223372017129599999L 
UTC_DATE_TIME_MAX_VALUE_IN_MILLIS = -9223372017043200000L 

इन मूल्यों के दोनों लगभग हैं:

new DateTime(milliseconds, DateTimeZone.UTC) 

यहां न्यूनतम/अधिकतम मान कि milliseconds (जावा 1.7 में परीक्षण) के लिए काम कर रहे हैं और Long.MAX_Value से 20 अरब दूर।

संबंधित मुद्दे