java - जावा-मिलीसेकंड से महीना / वर्ष(न सिर्फ वर्तमान समय)




calendar milliseconds (5)

कहते हैं, मेरे पास जावा में एक एल्गोरिथ्म है, जहां मैं हर वस्तु के साथ जुड़े समय के आधार पर मासिक आधार पर कुछ करना चाहता हूं।

उदाहरण के लिए, यदि Object a का समय long t , और युग युग के बाद से मिलीसेकंड में है, तो मुझे कैसे पता चलेगा कि t 03/2014 में एक समय है?

एक द्वितीयक प्रश्न के रूप में, मैं कई महीनों से पिछली बार समय-समय पर कैसे पुनरावृत्त हो सकता हूं - इसलिए यदि 1 मई, 2014 से शुरू हो रहा है, तो मैं पूरी तरह से अप्रैल, मार्च, फरवरी आदि में वापस कैसे जा सकता हूं, बिना किसी समस्या की चिंता किए बिना 28 - 31 महीने एक महीने में? मैं Calendar वर्ग का उपयोग करने पर विचार कर रहा था, लेकिन मुझे यकीन नहीं था कि मैं केवल MONTH चर को अद्यतन कर सकता हूं और मुझे सही मिलीसेकंड मान दे सकता है। जैसे, यह 31 मार्च का है, और मैं फरवरी से महीने का अद्यतन करता हूं, और फिर अचानक यह सोचता है कि यह 31 फरवरी है?


Answers

ऐसा करने का सबसे आसान तरीका है java.util.Calendar वर्ग का उपयोग करने के लिए जैसा कि आप अपने प्रश्न में उल्लेख करते हैं। आप आसानी से उपयोग करके एक उदाहरण प्राप्त कर सकते हैं

//use whatever time zone your milliseconds originiate from
//there is another getter that takes a Locale, which may be useful depending on your context
Calander c = Calendar.getInstance(TimeZone.getDefault());

फिर आप का प्रयोग करके समय निर्धारित कर सकते हैं

c.setTimeInMillis(t);

जब यह पता लगाया गया था कि आप DateFormat ऑब्जेक्ट का उपयोग करके परिणाम प्रिंट कर सकते हैं

DateFormat df = DateFormat.getInstance(DateFormat.SHORT);
System.out.println(df.format(c.getTime());

महीनों (या समय के किसी अन्य इकाई) के माध्यम से जाने के लिए, आप माह फ़ील्ड का उपयोग करके कैलेंडर में "जोड़" करेंगे:

c.add(Calendar.MONTH, -2);

अच्छी खबर यह है कि आप किसी अन्य समय इकाई के लिए add() पद्धति का उपयोग कर सकते हैं और Calendar वर्ग, जिस तरह से आप की अपेक्षा की जाती है, ठीक उसी तरह की तारीख को समायोजित करने का ध्यान रखेगा (यानी, सांस्कृतिक रूप से उचित तरीके से Locale द्वारा परिभाषित Calendar )

अन्त में, आप इसका उपयोग करके मिलीसेकेंड में वापस कर सकते हैं

long newTime = c.getTimeInMillis();

java.time में जावा 8 एपीआई का उपयोग करके आप निम्न java.time कर सकते हैं:

import java.time.Instant;
import java.time.Month;
import java.time.MonthDay;
import java.time.OffsetDateTime;

public static void main(String[] args) {
    long ms_since_epoch = 1_500_000_000_000L;
    Instant instant = Instant.ofEpochMilli(ms_since_epoch);

    // convert milliseconds in UTC to date
    OffsetDateTime dateUTC = OffsetDateTime.ofInstant(instant, ZoneOffset.UTC);

    // convert milliseconds in EST (UTC-0500) to date
    OffsetDateTime dateEST = OffsetDateTime.ofInstant(instant, ZoneOffset.ofHours(-5));
    // note: this is 2017-07-14 at 2:40

    // create a MonthDay from the date in EST
    MonthDay monthDay = MonthDay.of(dateEST.getMonth(), dateEST.getDayOfMonth());
    // note: this is 2017-07-13 at 21:40

    // loop over the next six months, after monthDay from dateEST
    MonthDay md = monthDay;
    for (int i = 0; i < 6; ++i) {
        md = md.with(md.getMonth().plus(1));
        System.out.println(md);
        // prints 08-13 through 01-14 (August 2013 through January 2014)
    }

    // loop over the previous six months, including this month
    md = monthDay;
    for (int i = 0; i < 6; ++i) {
        System.out.println(md);
        md = md.with(md.getMonth().minus(1));
        // prints 07-13 through 02-13 (July 2013 through February 2013)
    }
}

ध्यान दें कि महीनादिवस अपरिवर्तनीय है, इसलिए md.with(otherMonth) हुए महीने के साथ एक नया उदाहरण लौटाता है, और यह केवल एक महीने और एक दिन का प्रतिनिधित्व करता है, न कि वर्ष, समय और समय क्षेत्र के साथ एक पूर्ण तिथि। यह भी ध्यान दें कि टाइमस्टैम्प को परिवर्तित करने के लिए समय क्षेत्र के आधार पर एक अलग तारीख और समय अर्जित करता है, जो Calendar साथ भी सत्य होगा।


कौन सा युग? कौन सा समय क्षेत्र?

आपका प्रश्न महत्वपूर्ण मुद्दों पर ध्यान नहीं देता:

  • क्या युग से मिलीसेकंड? कई युग हैं सभी 3 सामान्य जावा-आधारित पुस्तकालयों (java.util.Date/Calendar, Joda-Time, java.time) में, युग 1 9 70 में यूटीसी के पहले पल (लीप सेकंडों को नजरअंदाज करना) है।
  • मिलीसेकंड के उस गिनती से किस समय क्षेत्र का प्रतिनिधित्व किया जाता है? यूटीसी या कुछ स्थानीय समय क्षेत्र?

Joda समय

यहां जोडा-टाइम 2.3 पुस्तकालय का उपयोग करते हुए कुछ उदाहरण कोड है।

कुछ मिलीसेकंड उत्पन्न करें long int का उपयोग न करें

long millis = new DateTime( 2014, 1, 2, 3, 4, 5, DateTimeZone.UTC ).getMillis();

कन्स्ट्रक्टर को मिलिसेकंड पास करके एक दिनांक समय इन्स्टैंट करें। उस टाइम ज़ोन को निर्दिष्ट करें जिसके द्वारा उन मिलीसेकंडों के बीच अंतर करने के लिए।

DateTime dateTime = new DateTime( millis, DateTimeZone.UTC );

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

DateTime firstOfMarchInParis = new DateTime( 2014, 3, 1, 0, 0, 0 , DateTimeZone.forID( "Europe/Paris" ) ).withTimeAtStartOfDay();
Interval marchInParis = new Interval( firstOfMarchInParis, firstOfMarchInParis.plusMonths( 1) );

"हाफ़-ओपन" दृष्टिकोण का उपयोग करके तुलना की तुलना में डेट-टाइम कार्य में सर्वश्रेष्ठ प्रदर्शन किया जाता है "आधे-ओपन" एक गणित शब्द है, जिसका अर्थ है शुरुआत आरंभिक है और अंत अनन्य है। इसलिए अंतराल ऊपर "पहले मार्च के पहले पल से और ऊपर जाकर, लेकिन अगले महीने के पहले का पहला पल भी शामिल नहीं " के रूप में परिभाषित किया गया है। जोडा-टाइम इस "आधे खुले" दृष्टिकोण का उपयोग करता है।

boolean isTargetInMarchInParis = marchInParis.contains( dateTime );

महीनों को जोड़ने / घटाए जाने के बारे में आपके द्वितीयक प्रश्न के लिए, नोट करें कि जोडा-टाइम दिनांक समय पद्धतियाँ plusMonths और minusMonths आप जिस व्यवहार को चाहते हैं minusMonths दे।


मुझे लगता है कि आपके पहले प्रश्न का जवाब यहां दिया गया है कि जावा को समय प्रारूप में मिलीसेकंड परिवर्तित किया गया है

आपको केवल एक नया Date ऑब्जेक्ट बनाने और निर्माता को टाइमस्टैम्प पास करने की आवश्यकता है। तो आप वांछित तारीख को प्रारूपित कर सकते हैं


क्या देता है? यह काम करता हैं। बस इसे नजरअंदाज करें:

@SuppressWarnings("unchecked")

नहीं, आप इसे पैरामीटर cannot कर cannot । मैं इसके बजाय एक List<Map<K, V>> उपयोग करना चाहता हूं।

List<Map<String, String>> listOfMaps = new ArrayList<Map<String, String>>();

संग्रह और मानचित्र के बारे में अधिक जानने के लिए, इस ट्यूटोरियल को देखें





java calendar milliseconds