मुझे जावा में बिना समय के तारीख कैसे मिल सकती है?


235

स्टैक ओवरफ्लो प्रश्न से जारी है जावा कार्यक्रम टाइमस्टैम्प के बिना वर्तमान तिथि प्राप्त करने के लिए :

समय के बिना दिनांक ऑब्जेक्ट प्राप्त करने का सबसे कुशल तरीका क्या है? क्या इन दोनों के अलावा कोई और रास्ता है?

// Method 1
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date dateWithoutTime = sdf.parse(sdf.format(new Date()));

// Method 2
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
dateWithoutTime = cal.getTime();

अपडेट :

  1. मुझे जोडा-टाइम के बारे में पता था ; मैं ऐसे सरल (मुझे लगता है) कार्य के लिए अतिरिक्त पुस्तकालय से बचने की कोशिश कर रहा हूं। लेकिन अब तक के जवाबों के आधार पर जोडा-टाइम बेहद लोकप्रिय लगता है, इसलिए मैं इस पर विचार कर सकता हूं।

  2. तक कुशल , मेरा मतलब है मैं अस्थायी वस्तु से बचना चाहते हैं Stringरचना के रूप में द्वारा इस्तेमाल किया method 1, इस बीच method 2एक समाधान के बजाय एक हैक की तरह लगता है।


1
कुशल? क्या आपको पद्धति 1 द्वारा प्रदान की गई तुलना में अधिक दक्षता की आवश्यकता है?
जोहान Sjöberg

2
"कुशल" से आपका क्या अभिप्राय है? एक तारीख मूल रूप से एक लंबी टाइप है, आप वास्तव में उससे कम मेमोरी में ऐसा नहीं कर सकते। यदि आपका मतलब "सुविधाजनक" है, तो Joda समय जाने का रास्ता है।
मिलीमोसे

3
+1 वास्तव में मेरे पास जो प्रश्न था।
अल्बा मेंडेज़

1
मुझे विधि पसंद है 2. एक उपयोगिता वर्ग में एक स्थिर विधि बनाएं और बस इसका उपयोग करें। मैं वर्षों से यह दृष्टिकोण रखता हूं।
विल्सन फ्रीटस

1
आपके "अपडेट 1" पर नाइटपैकिंग: यदि यह "ऐसा सरल कार्य" था, तो मुझे लगता है कि सूर्य ऐसे भयावह और अक्षम्य एपीआई पर नहीं आया होगा, और आप (और बहुत से अन्य लोग) उस प्रश्न को नहीं पूछेंगे। सब पर ;-)
Flávio Etrusco

जवाबों:


108

यदि आप पूरी तरह करो है उपयोग करने के लिए java.util.Date? मैं पूरी तरह से अनुशंसा कि आप इसके बजाय जावा 8 से जोडा टाइम या java.timeपैकेज का उपयोग करें। विशेष रूप से, जबकि दिनांक और कैलेंडर हमेशा समय में एक विशेष तात्कालिकता का प्रतिनिधित्व करते हैं, "सिर्फ एक तारीख" के रूप में ऐसी कोई अवधारणा नहीं है, जोडा टाइम में इसका प्रतिनिधित्व करने वाला एक प्रकार है ( LocalDate)। यदि आप उन प्रकारों का उपयोग करने में सक्षम हैं जो आपके प्रकार हैं जो यह दर्शाते हैं कि आप वास्तव में क्या करने की कोशिश कर रहे हैं।

Joda Time का उपयोग करने के कई, कई अन्य कारण हैं या java.time बिल्ट-इन java.utilप्रकारों के बजाय - वे आम तौर पर बेहतर API हैं। java.util.Dateयदि आप डेटाबेस इंटरैक्शन के लिए आवश्यक है, तो आप हमेशा अपने कोड की सीमाओं पर / से परिवर्तित कर सकते हैं ।


75
उद्यम अनुप्रयोगों में हमारे पास हमेशा अन्य पुस्तकालयों को जोड़ने / उपयोग करने का विकल्प नहीं होता है। मैं पॉइडर को जोडा टाइम की सराहना करता हूं, लेकिन यह वास्तव में मानक जावा का उपयोग करते हुए दिनांक भाग प्राप्त करने के मूल मुद्दे का जवाब नहीं है। धन्यवाद। ऊपर उठते हुए चतुरंग का उत्तर।
Noogrub

3
@noogrub: Chathugranga का जवाब मूल प्रश्न है, जो कि कैसे एक पाने के लिए के बारे में पूछ रहा है उत्तर नहीं मिलता है Date- कि इसका जवाब वस्तु स्वरूप एक स्ट्रिंग है, जो एक ही बात नहीं है के लिए एक तिथि। मौलिक रूप से, यह पूछना कि कौन सी तारीख है Date, अधिक जानकारी के बिना एक अर्थहीन प्रश्न है: आप जिस समय क्षेत्र और कैलेंडर प्रणाली का उपयोग कर रहे हैं।
जॉन स्कीट

7
"उद्यम अनुप्रयोगों में हमारे पास हमेशा अन्य पुस्तकालयों को जोड़ने / उपयोग करने का विकल्प नहीं होता है"। वास्तव में ? क्या आप सुझाव दे रहे हैं कि आप तीसरे पक्ष के कामों का उपयोग नहीं कर सकते हैं?
ब्रायन एग्न्यू

3
@BrianAgnew noogrub की टिप्पणी गैर-तकनीकी बाधाओं से संबंधित प्रतीत होती है, मुझे लगता है
जोश_GD

3
आज के दृष्टिकोण से: " जावा एसई 8 से पहले जावा के लिए जोडा-टाइम डी वास्तविक मानक तिथि और समय पुस्तकालय है। उपयोगकर्ताओं को अब java.time (JSR-310) पर माइग्रेट करने के लिए कहा जाता है।"
Drux

66

यहाँ मैं आज की तारीख के लिए निर्धारित समय के साथ प्रयोग किया जाता है 00:00:00:

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

Date today = new Date();

Date todayWithZeroTime = formatter.parse(formatter.format(today));

28
यह किस तरह से मूल प्रश्न में पहले से ही प्रस्तावित "विधि 1" से अलग है?
क्रिस

यह पता नहीं चलता है कि यह किस समय में होता है (जेवीएम की डिफ़ॉल्ट समय-सीमा को छोड़ दिया जाता है)।
डारेल टीग्यू

58

आप DateUtils.truncate का उपयोग कर सकते हैं Apache Commons लाइब्रेरी से ।

उदाहरण:

DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH)

3
यदि आप एक नया पुस्तकालय जोड़ने जा रहे हैं, तो इसे Apache Commons के बजाय Joda होने दें।
डिब्बीके २०'१६ को ib:०

6
+1 @Dibbeke अंतर सिर्फ इतना नहीं है कि आप एक पुस्तकालय को दूसरे के बजाय जोड़ रहे होंगे। कभी-कभी किसी को एक तिथि से समय को कम करने के तुच्छ कार्य के लिए पूरी तरह से एक नया पुस्तकालय सीखना नहीं चाहिए। या कोड को कभी भी पूर्व / कभी-कभी उत्तरार्द्ध का उपयोग करके दिनांक / कैलेंडर को जोडा तिथियों के साथ मिलाना नहीं चाहता है। या इस तरह के तुच्छ उद्देश्य के लिए किसी अन्य पुस्तकालय के साथ सभी अच्छी तरह से काम करने की तारीख / कैलेंडर-आधारित कोड को बदलने का औचित्य नहीं कर सकता / ठीक नहीं कर सकता। सुझाव देते समय जोडा निश्चित रूप से अच्छा है क्योंकि यह स्पष्ट रूप से बेहतर है और बस द राइट थिंग, कभी-कभी वास्तविक जीवन में किक करता है।
सेंटीबैलर्स

प्रतिभाशाली! मेरी मदद की
Thiesen

37

क्या इन दोनों के अलावा कोई और रास्ता है?

हाँ वहाँ है।

LocalDate.now( 
    ZoneId.of( "Pacific/Auckland" ) 
)

java.time

जावा 8 और बाद में नए जावा.टाइम पैकेज बिल्ट-इन के साथ आता है। ट्यूटोरियल देखें । जावा.टाइम कार्यक्षमता का अधिकांश भाग तीन-बैकपोर्ट में जावा 6 और 7 के लिए वापस पोर्ट किया गया है और आगे तीनटीनबप में Android के लिए अनुकूलित किया गया है

जोडा-टाइम के समान , java.time एक ऑफर देता हैLocalDate दिन-प्रतिदिन और समय-क्षेत्र के बिना केवल दिनांक मान का प्रतिनिधित्व करने के लिए वर्ग ।

ध्यान दें कि किसी विशेष तिथि को निर्धारित करने के लिए समय क्षेत्र महत्वपूर्ण है। उदाहरण के लिए, पेरिस में मध्यरात्रि के समय स्ट्रोक की तारीख अभी भी मॉन्ट्रियल में "कल" ​​है।

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;

डिफ़ॉल्ट रूप से, java.time किसी दिनांक या दिनांक-समय मान का एक स्ट्रिंग प्रतिनिधित्व बनाने में ISO 8601 मानक का उपयोग करता है । (जोडा-टाइम के साथ एक और समानता।) तो बस toString()पाठ की तरह उत्पन्न करने के लिए कॉल करें 2015-05-21

String output = today.toString() ; 

जावा के बारे में

Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date, Calendar, और SimpleDateFormat

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

अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है

Java.time कक्षाएं कहाँ से प्राप्त करें?

ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के लिए भविष्य के संभावित अतिरिक्त के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval, YearWeek, YearQuarter, और अधिक


1
समय क्षेत्र का उल्लेख करने के लिए धन्यवाद । यह मेरे लिए नहीं हुआ था कि "यह किस दिन है" एक पूर्ण अवधारणा नहीं है।
टूलमेकरसेव

@ToolmakerSteve दिनांक प्राप्त करने में हमेशा एक समय क्षेत्र शामिल होता है। लेकिन चाल यह है कि यदि आप एक समय क्षेत्र निर्दिष्ट करने में विफल रहते हैं, तो आपका जेवीएम का वर्तमान डिफ़ॉल्ट समय क्षेत्र स्वचालित रूप से तिथि निर्धारित करने में लागू होता है। उसके ऊपर, JVM का वर्तमान डिफ़ॉल्ट समय क्षेत्र किसी भी समय बदल सकता है ! JVM के भीतर किसी भी ऐप के किसी भी कोड में कोई भी TimeZone.setDefaultरनटाइम के दौरान कॉल कर सकता है और तुरंत उस JVM में चल रहे अन्य सभी कोड को प्रभावित कर सकता है। कहानी का नैतिक: हमेशा एक समय क्षेत्र निर्दिष्ट करें।
बेसिल बॉर्क

22

सबसे सीधा तरीका:

long millisInDay = 60 * 60 * 24 * 1000;
long currentTime = new Date().getTime();
long dateOnly = (currentTime / millisInDay) * millisInDay;
Date clearDate = new Date(dateOnly);

5
मेरे लिए, यह वर्तमान में है: "सत फ़रवरी 19 01 : 00: 00 सीईटी 2011"। यदि आप उस का उपयोग करना चाहते हैं, तो केवल यूटीसी के साथ।
क्रिस लार्कर

4
क्या पंक्ति 3 long dateOnly = (currentTime / millisInDay) * millisInDay;लेखन के समान नहीं है long dateOnly = currentTime;?
क्रिस

5
यह पूर्णांक गणित के कारण नहीं है। इसके बारे में अधिक विचार करें जैसे Math.floor (currentTime / millisInDay) * millisInDay। वह प्रभावी ढंग से 00:00:00 उस तरह से समय निर्धारित कर रहा है।
निकोलस फ्लायंट

2
यह समाधान संभवतः अधिकांश एप्लिकेशन के लिए ठीक है, लेकिन इस धारणा को चेतावनी दी जाती है कि एक दिन में 60 * 60 * 24 * 1000 हमेशा सच नहीं होता है। आप उदाहरण के लिए कुछ दिनों में लीप सेकंड कर सकते हैं।
पियरे-एंटोनी

1
यह यकीनन सबसे अधिक रुकावट है और अन्य 1 और 2-लाइन स्पष्ट और संक्षिप्त तरीकों पर अनुशंसित तरीका नहीं है।
डारेल टीग्यू

22

इन सवालों का मानक जवाब है, जोडा टाइम का उपयोग करना । एपीआई बेहतर है और यदि आप फॉर्मेटर्स और पार्सर्स का उपयोग कर रहे हैं तो आप थ्रेड सेफ्टी के गैर-सहज ज्ञान युक्त अभाव से बच सकते हैं SimpleDateFormat

Joda का उपयोग करने का अर्थ है कि आप बस कर सकते हैं:

LocalDate d = new LocalDate();

अद्यतन :: जावा 8 का उपयोग करके इसे उपयोग में लाया जा सकता है

LocalDate date = LocalDate.now();

जावा 8 में नया जावा.टाइम पैकेज, LocalDateजोडा-टाइम के समान एक वर्ग भी प्रदान करता है ।
बेसिल बॉर्क

1
आदर्श रूप से आप DateTimeZoneउस लोकलडेट कंस्ट्रक्टर के पास जाएंगे । वर्तमान तिथि का निर्धारण समय क्षेत्र पर निर्भर करता है, क्योंकि पेरिस मॉन्ट्रियल से पहले एक नई तारीख शुरू करता है। यदि आप समय क्षेत्र को छोड़ देते हैं, तो आपका JVM का डिफ़ॉल्ट समय क्षेत्र लागू हो जाता है। आमतौर पर डिफ़ॉल्ट पर भरोसा करने से बेहतर है।
तुलसी बॉर्क

8

यह इसे करने का एक सरल तरीका है:

Calendar cal = Calendar.getInstance();
SimpleDateFormat dateOnly = new SimpleDateFormat("MM/dd/yyyy");
System.out.println(dateOnly.format(cal.getTime()));

4
यह उत्तर प्रश्न को संबोधित करने में विफल रहता है। एक स्वरूपित स्ट्रिंग प्राप्त करना लक्ष्य नहीं था।
बेसिल बोर्के

7

मानक जावा रनटाइम में दिनांक रूटीन के संबंध में टाइमस्टैम्प के बिना किसी तिथि के बारे में बात करने का कोई मतलब नहीं है, क्योंकि यह अनिवार्य रूप से एक विशिष्ट मिलीसेकंड के लिए मैप करता है और एक तारीख नहीं। कहा जाता है कि मिलीसेकंड में आंतरिक रूप से दिन का समय जुड़ा होता है जो इसे डेलाइट सेविंग टाइम और अन्य कैलेंडर समायोजन जैसी टाइमजोन समस्याओं के प्रति संवेदनशील बनाता है। देखें कि इन दो बार (1927 में) क्यों एक अजीब परिणाम दे रहा है? एक दिलचस्प उदाहरण के लिए।

यदि आप मिलीसेकंड के बजाय तिथियों के साथ काम करना चाहते हैं, तो आपको कुछ और उपयोग करने की आवश्यकता है। Java 8 के लिए तरीकों का एक नया सेट प्रदान करता है, जो आप पूछते हैं। जावा 7 के लिए और पहले http://www.joda.org/joda-time/ का उपयोग करें


3
नोट: "आधी रात को तारीख" कहने वाले लोग दिन की बचत के समय और कई टाइमज़ोन को अच्छी तरह से संभाल नहीं पाते हैं।
थोरबजोरन रावन एंडरसन

मैं इसकी पुष्टि करता हूं, मैं अपने ऐप में एक दिन की तारीखों को बढ़ा रहा था, और डीएसटी (मेरा देश डीएसटी का उपयोग नहीं करता है) के साथ एक टाइमज़ोन में उपयोगकर्ताओं से बग रिपोर्ट के बारे में सीखा। दिन में डीएसटी शुरू होता है मेरा ऐप 12 के बजाय 11 घंटे जोड़ता है। शायद दोपहर का उपयोग "नो टाइम" तारीख के लिए बेहतर है?
जोस_जीडी

1
@Jose_GD यह अभी भी सबसे अच्छा हैक है। आपको youtube.com/watch?v=-5wpm-gesOY मनोरंजक लग सकता है ।
Thorbjørn रेवन एंडरसन

@ थोरबॉर्न, आप सही कह रहे हैं, मैं सिर्फ जोडाटाइम से बचना चाहता था क्योंकि मेरे लिए सिर्फ एक फीचर साउंड ओवरकिल के लिए लाइब्रेरी जोड़ना। मुझे उस वीडियो के बारे में पता था, वास्तव में मजेदार।
जोस_जीडी

1
@Jose_GD बिंदु यह था कि वास्तविक वास्तविक उपयोग का मामला है जिसमें आपके दृष्टिकोण को बग माना जाएगा। यदि आपने एक पाया, तो और भी हो सकता है ... मुझे नहीं पता कि जोडा इसे कैसे संभालता है, लेकिन आप एक नज़र रख सकते हैं। यह भी ध्यान दें कि जावा 8 एक नया डेट-टाइम लाइब्रेरी लाता है (जोडा के साथ अनुभवों के आधार पर) जिसे आप देखना चाहते हैं।
थोरबजोरन रावन एंडरसन

4

निश्चित रूप से सबसे सही तरीका नहीं है, लेकिन अगर आपको समय के बिना तारीख पाने के लिए एक त्वरित समाधान की आवश्यकता है और आपको तीसरे पक्ष के पुस्तकालय का उपयोग करने की इच्छा नहीं है, तो यह करना चाहिए

    Date db = db.substring(0, 10) + db.substring(23,28);

मुझे केवल दृश्य उद्देश्यों के लिए तिथि की आवश्यकता थी और जोडा को प्रतिस्थापित नहीं कर सकता था इसलिए मैंने प्रतिस्थापित कर दिया।


4
// 09/28/2015
System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(Calendar.getInstance().getTime()));

// Mon Sep 28
System.out.println( new Date().toString().substring(0, 10) );

// 2015-09-28
System.out.println(new java.sql.Date(System.currentTimeMillis()));

// 2015-09-28
// java 8
System.out.println( LocalDate.now(ZoneId.of("Europe/Paris")) ); // rest zones id in ZoneId class

3

खैर, जहां तक ​​मुझे पता है कि इसे प्राप्त करने का कोई आसान तरीका नहीं है यदि आप केवल मानक JDK का उपयोग करते हैं।

आप निश्चित रूप से, उस तर्क को मेथड 2 में एक स्थैतिक फ़ंक्शन में सहायक वर्ग में डाल सकते हैं, जैसे कि यहाँ toBeginningOfTheDay-method

तो आप दूसरी विधि को छोटा कर सकते हैं:

Calendar cal = Calendar.getInstance();
Calendars.toBeginningOfTheDay(cal);
dateWithoutTime = cal.getTime();

या, यदि आपको वास्तव में इस प्रारूप में वर्तमान दिन की आवश्यकता है, तो आप इसे केवल एक और स्थिर सहायक विधि में लपेट सकते हैं, जिससे यह एक-लाइनर बन जाएगा।


3

यदि आप चाहते हैं कि सभी अन्य अव्यवस्थाओं के बिना "YYYY-MM-DD" जैसी तारीख को देखना है जैसे "Thu May 21 12:08:18 EDT 2015" तो बस उपयोग करें java.sql.Date। इस उदाहरण को वर्तमान तिथि मिलती है:

new java.sql.Date(System.currentTimeMillis());

java.sql.Dateका एक उपवर्ग भी है java.util.Date


3

यदि आपको समय के बिना, वर्तमान तिथि की आवश्यकता है, तो एक और विकल्प है:

DateTime.now().withTimeAtStartOfDay()

1
प्रश्न का कोई समय नहीं पूछा गया। आपका परिणाम एक दिनांक-समय ऑब्जेक्ट है जो वास्तव में एक दिन का समय होता है, वह समय 00:00:00आमतौर पर होता है ( डीएसटी जैसे विसंगतियों के लिए समय क्षेत्र के अनुसार भिन्न हो सकता है )। तो, अन्य उत्तर के रूप में, LocalDateवर्ग अधिक उपयुक्त है, जोडा-टाइम से (यह मानते हुए कि आप जोडा-टाइम का संदर्भ दे रहे हैं - जिसे आपको जावा के साथ बंडल नहीं किए जाने का हवाला देते समय स्पष्ट रूप से ध्यान देना चाहिए)।
बेसिल बोर्क

3

उपयोग करें LocalDate.now()और Dateनीचे की तरह परिवर्तित करें:

Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());

1
JVM का वर्तमान डिफ़ॉल्ट समय क्षेत्र रनटाइम के दौरान किसी भी समय बदल सकता है। JVM के भीतर किसी भी एप्लिकेशन के किसी भी धागे में कोई भी कोड कॉल कर सकता है TimeZone.setDefault। आपका कोड ZoneId.systemDefaultदो बार कॉल कर रहा है , पहला अंतर्निहित है LocalDate.now()और दूसरा स्पष्ट है atStartOfDay। रनटाइम के दौरान उन दो क्षणों के बीच, वर्तमान डिफ़ॉल्ट क्षेत्र बदल सकता है। मैं क्षेत्र को एक चर में कैप्चर करने का सुझाव देता हूं, और दोनों तरीकों से गुजरता हूं।
तुलसी बोर्क

2

यदि आपको केवल गूंज उद्देश्य के लिए दिनांक भाग की आवश्यकता है, तो

Date d = new Date(); 
String dateWithoutTime = d.toString().substring(0, 10);

1
मुझे नहीं लगता कि यह i18n के अनुकूल है
मार्क लापसा

2

इस बारे में क्या?

public static Date formatStrictDate(int year, int month, int dayOfMonth) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(year, month, dayOfMonth, 0, 0, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    return calendar.getTime();
}

1

वायडर-समय की जाँच करें । यह java.util और Joda-time दोनों के लिए एक सरल और कुशल विकल्प है। इसमें एक सहज ज्ञान युक्त एपीआई और कक्षाएं हैं जो अकेले टाइमस्टैम्प के बिना तिथियों का प्रतिनिधित्व करती हैं।


1

जावा के विशाल टाइमज़ोन डेटाबेस का पूर्ण उपयोग करने वाला सबसे कठोर तरीका है और सही है:

long currentTime = new Date().getTime();
long dateOnly = currentTime + TimeZone.getDefault().getOffset(currentTime);

1

यहां स्ट्रिंग और बैक में कोई रूपांतरण नहीं होने के साथ एक साफ समाधान है, और यह भी समय को कई बार फिर से गणना नहीं करता है क्योंकि आप समय के प्रत्येक घटक को शून्य पर रीसेट करते हैं। इसका उपयोग भी करता है% दोहरे ऑपरेशन से बचने के लिए विभाजित के बजाय गुणा (मापांक) ।

इसके लिए किसी तृतीय-पक्ष निर्भरता की आवश्यकता नहीं होती है, और यह पारित किए गए कैलेंडर ऑब्जेक्ट के समय को प्राप्त करता है। यह फ़ंक्शन उस समय (दिनांक) के समय दिनांक (कैलेंडर) में 12 बजे समय पर वापस आ जाता है।

public static Calendar date_only(Calendar datetime) {
    final long LENGTH_OF_DAY = 24*60*60*1000;
    long millis = datetime.getTimeInMillis();
    long offset = datetime.getTimeZone().getOffset(millis);
    millis = millis - ((millis + offset) % LENGTH_OF_DAY);
    datetime.setTimeInMillis(millis);
    return datetime;
}

मैं बहुत आश्वस्त नहीं हूं कि यह समर टैम (डीएसटी) का सम्मान करेगा?
ओले वीवी

0

अधिक से अधिक तीसरे पक्ष के पुस्तकालयों का उपयोग न करना पसंद करें। मुझे पता है कि इस तरह से पहले उल्लेख किया गया है, लेकिन यहाँ एक अच्छा साफ तरीका है:

  /*
    Return values:
    -1:    Date1 < Date2
     0:    Date1 == Date2
     1:    Date1 > Date2

    -2:    Error
*/
public int compareDates(Date date1, Date date2)
{
    SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");

    try
    {
        date1 = sdf.parse(sdf.format(date1));
        date2 = sdf.parse(sdf.format(date2));
    }
    catch (ParseException e) {
        e.printStackTrace();
        return -2;
    }

    Calendar cal1 = new GregorianCalendar();
    Calendar cal2 = new GregorianCalendar();

    cal1.setTime(date1);
    cal2.setTime(date2);

    if(cal1.equals(cal2))
    {
        return 0;
    }
    else if(cal1.after(cal2))
    {
        return 1;
    }
    else if(cal1.before(cal2))
    {
        return -1;
    }

    return -2;
}

खैर, ग्रेगोरियन कैलंडर का उपयोग नहीं करना शायद एक विकल्प है!


0

मैंने इसे अपने ऐप के लिए बनाया है:

public static Date getDatePart(Date dateTime) {
    TimeZone tz = TimeZone.getDefault();
    long rawOffset=tz.getRawOffset();
    long dst=(tz.inDaylightTime(dateTime)?tz.getDSTSavings():0);
    long dt=dateTime.getTime()+rawOffset+dst; // add offseet and dst to dateTime
    long modDt=dt % (60*60*24*1000) ;

    return new Date( dt
                    - modDt // substract the rest of the division by a day in milliseconds
                    - rawOffset // substract the time offset (Paris = GMT +1h for example)
                    - dst // If dayLight, substract hours (Paris = +1h in dayLight)
    );
}

Android API स्तर 1, कोई बाहरी लाइब्रेरी नहीं है। यह दिन के उजाले और डिफ़ॉल्ट समय का सम्मान करता है। कोई स्ट्रिंग हेरफेर नहीं है इसलिए मुझे लगता है कि यह तरीका आपके मुकाबले अधिक सीपीयू कुशल है लेकिन मैंने कोई परीक्षण नहीं किया है।


0

यो जोडा समय का उपयोग कर सकते हैं।

private Date dateWitoutTime(Date date){
 return new LocalDate(date).toDate()
}

और आप के साथ फोन:

Date date = new Date();
System.out.println("Without Time = " + dateWitoutTime(date) + "/n  With time = " + date);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.