2012-12-15 16 views
12

मैं यूनिक्स टाइमस्टैम्प का उपयोग कर डेटाबेस में समय/तिथियां संग्रहीत कर रहा हूं। मैं कुछ निश्चित दिनों में सभी उदाहरण प्राप्त करना चाहता हूं इसलिए मुझे डेटाबेस से पूछताछ के लिए दिन की शुरुआत के लिए टाइमस्टैम्प की गणना करने की आवश्यकता है।दिन की शुरुआत के लिए टाइमस्टैम्प प्राप्त करें

मैंने एमकेटाइम को डेट ऑब्जेक्ट से दिन/महीने/वर्ष के मूल्यों और घंटे और मिनट को शून्य तक सेट करके PHP में एक ही चीज़ की है। जावा/एंड्रॉइड में इसके लिए समान कार्य प्रतीत नहीं होते हैं (तिथि के विशिष्ट हिस्सों को प्राप्त करने के लिए कार्य बहिष्कृत किए जाते हैं)

क्या कोई इस पर कुछ मार्गदर्शन दे सकता है? धन्यवाद

संपादित करें:

ठीक है तो मुझे एहसास हुआ कि यह काम हो सकता है:

public static int startOfDay(Timestamp time) { 
     Calendar cal = dateToCalendar(new Date(time.getTime())); 
     cal.add(Calendar.HOUR_OF_DAY, -Calendar.HOUR_OF_DAY); 
     cal.add(Calendar.MINUTE, -Calendar.MINUTE); 
     cal.add(Calendar.SECOND, -Calendar.SECOND); 
     Log.i("Time", cal.getTime().toString());   
     return (int) cal.getTimeInMillis()/1000; 
} 

लेकिन जब मैं इस भाग गया बस अब मुझे मिल गया:

शनि 15 दिसंबर 01:24:00 जीएमटी 2012

सेकंड सही हैं लेकिन घंटे और मिनट गलत हैं ??

उत्तर

32

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

यदि आप समय क्षेत्र में दिन की शुरुआत की गणना करना चाहते हैं तो उपयोगकर्ता वर्तमान में अपने फोन में सेट कर चुका है। साथ Calendar उदाहरण बनाएँ:

Calendar cal = Calendar.getInstance(); 

एक विशिष्ट समय क्षेत्र में उपयोग के लिए उदाहरण के लिए:

// use UTC time zone 
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 

तो दिन की शुरुआत सेट:

cal.setTime(time); // compute start of the day for the timestamp 
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0); 
6
public static int startOfDay(Timestamp time) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTimeInMillis(time.getTime()); 
    cal.set(Calendar.HOUR_OF_DAY, 0); //set hours to zero 
    cal.set(Calendar.MINUTE, 0); // set minutes to zero 
    cal.set(Calendar.SECOND, 0); //set seconds to zero 
    Log.i("Time", cal.getTime().toString());   
    return (int) cal.getTimeInMillis()/1000; 
} 
+0

ओह धन्यवाद यह नहीं पता था कि यह इस तरह काम करता है। –

+0

इस विधि को कैसे कॉल करें –

1

tl; डॉ

ZoneId z = ZoneId.of("America/Montreal"); 
long secondsSinceEpoch = ZonedDateTime.now(z).toLocalDate().asStartOfDay(z).toEpochSecond() ; 

विवरण

स्वीकृत Answer by Tomik सही लेकिन पुराना है। परेशानी पुरानी विरासत डेट-टाइम कक्षाओं को जावा.टाइम कक्षाओं द्वारा सप्लाई किया गया है।

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

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

हो रही है दिन के पहले पल LocalDate से गुजर रही की आवश्यकता है। LocalDate कक्षा समय-समय पर और समय क्षेत्र के बिना दिनांक-केवल मूल्य का प्रतिनिधित्व करती है।

LocalDate today = zdt.toLocalDate(); 
ZonedDateTime zdtTodayStart = today.atStartOfDay(z); 

ध्यान दें कि हमने जावा को जाने दिया है।समय 00:00:00 मानने और हार्ड कोडिंग करने के बजाए दिन की शुरुआत निर्धारित करता है। डेलाइट सेविंग टाइम (डीएसटी) और अन्य विसंगतियों के कारण, दिन किसी अन्य समय जैसे 01:00:00 से शुरू हो सकता है।

स्पष्ट रूप से, unix timestamp द्वारा आपका मतलब यूटीसी में 1 9 70 के पहले पल के बाद से पूरे सेकंड की गिनती है। ZonedDateTime कक्षा में आपको वह नंबर देने का एक तरीका है। ध्यान दें कि इसका मतलब डेटा हानि हो सकता है क्योंकि ZonedDateTime में नैनोसेकंड के संकल्प के साथ एक सेकंड का अंश हो सकता है।

long secondsSinceEpoch = zdtTodayStart.toEpochSecond(); 

java.time

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

Joda-Time प्रोजेक्ट, अब maintenance mode में, जावा.टाइम पर माइग्रेशन की सलाह देता है।

और जानने के लिए, Oracle Tutorial देखें। और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें।

java.time कार्यक्षमता की ज्यादातर ThreeTen-Backport में जावा 6 & से 7 वापस भेजा जाता है और आगे (How to use… देखें) ThreeTenABP में Android के लिए अनुकूलित।

ThreeTen-Extra प्रोजेक्ट अतिरिक्त कक्षाओं के साथ जावा.टाइम बढ़ाता है। यह परियोजना java.time के संभावित भविष्य के जोड़ों के लिए एक सिद्ध भूमि है। आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे Interval, YearWeek, YearQuarter, आदि।

3

इस सरल समाधान के बारे में आप क्या सोचते हैं?

Long currentDayStart = timestamp - timestamp%86400000; 
Long currentDayEnd = timestamp+86399999; 

टाइमस्टैम्प के लिए टाइमज़ोन बदलना अनावश्यक है। यहां अधिक: https://stackoverflow.com/a/23062640

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