Java में currentTimeMillis को डेट में कैसे बदलें?


140

सर्वर में उत्पन्न कुछ लॉग फ़ाइल में मेरे पास मिलीसेकंड है, मुझे यह भी पता है कि लॉग फ़ाइल कहाँ से उत्पन्न हुई थी, मेरी समस्या निर्दिष्ट प्रारूप में मिलीसेकंड को तारीख में बदलने की है। उस लॉग की प्रोसेसिंग अलग-अलग समय क्षेत्र में स्थित सर्वर पर हो रही है। "SimpleDateFormat" प्रोग्राम में परिवर्तित होने के दौरान मशीन की तारीख ले रहा है क्योंकि इस तरह की प्रारूपित तारीख सर्वर के सही समय का प्रतिनिधित्व नहीं करती है। क्या कोई तरीका है इस सुरुचिपूर्ण ढंग से संभालने के लिए?

long yourmilliseconds = 1322018752992l;
        //1322018752992-Nov 22, 2011 9:25:52 PM 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS",Locale.US);

GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(yourmilliseconds);

System.out.println("GregorianCalendar -"+sdf.format(calendar.getTime()));

DateTime jodaTime = new DateTime(yourmilliseconds, 
                    DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss,SSS");

System.out.println("jodaTime "+parser1.print(jodaTime));

आउटपुट:

Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992

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

क्या समस्या यह थी कि मिलीसेकंड की संख्या 1970-01-01T00: 00: 00Z से नहीं, बल्कि किसी और क्षण से थी?
तुलसी बोरक

FYI करें, दोनों भयानक पुराने समय की कक्षाएं ( GregorianCalendar, SimpleDateFormatइत्यादि) और उत्कृष्ट Joda- समय पुस्तकालय अब आधुनिक java.time कक्षाओं द्वारा दबाए गए हैं।
बेसिल बॉर्क

जवाबों:


115
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);

int mYear = calendar.get(Calendar.YEAR);
int mMonth = calendar.get(Calendar.MONTH);
int mDay = calendar.get(Calendar.DAY_OF_MONTH);

मुझे यह काम करने के लिए कैलेंडर को अंतिम रूप देना था। final Calendar calendar = Calendar.getInstance();
विक्टर ऑगस्टो

4
कैलेंडर ऑब्जेक्ट्स को आमतौर पर काफी बड़ा माना जाता है, इसलिए जब संभव हो तो इससे बचना चाहिए। एक दिनांक ऑब्जेक्ट यह मानकर बेहतर होने वाला है कि आपके पास आवश्यक कार्यक्षमता है। "तिथि तिथि = नई तिथि (मिलिस)?" उपयोगकर्ता द्वारा प्रदान किए गए दूसरे उत्तर में AVD सबसे अच्छा मार्ग होने जा रहा है :)
डिक लुकास

1
किसी तरह, के लिए 1515436200000l, मैं के calendar.get(Calendar.MONTH))रूप में हो रही है 0!
साजिब आचार्य

FYI करें, इस तरह के रूप में बहुत परेशानी पुराने तिथि-समय कक्षाएं java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब कर रहे हैं विरासत , द्वारा का स्थान ले लिया java.time जावा 8 और बाद में बनाया गया वर्गों। ओरेकल द्वारा ट्यूटोरियल देखें ।
बेसिल बॉर्क

2
@SajibAcharya ध्यान दें कि Calendar.MONTH के लिए इंस्टेंस 0 से शुरू होता है; जैसा कि हम जानते हैं कि आपको "वास्तविक" महीना प्राप्त करने के लिए एक जोड़ने की आवश्यकता है। उदाहरण: ० = जनवरी, १ = फरवरी, २ = मार्च, आदि
शगबर्ग

256

आप java.util.Dateवर्ग का उपयोग कर सकते हैं और फिर SimpleDateFormatप्रारूप को प्रारूपित कर सकते हैं Date

Date date=new Date(millis);

हम जावा एसई 8 में पेश किए गए java.time पैकेज (ट्यूटोरियल) - डेटटाइम एपीआई का उपयोग कर सकते हैं ।

var instance = java.time.Instant.ofEpochMilli(millis);
var localDateTime = java.time.LocalDateTime
                        .ofInstant(instance, java.time.ZoneId.of("Asia/Kolkata"));
var zonedDateTime = java.time.ZonedDateTime
                            .ofInstant(instance,java.time.ZoneId.of("Asia/Kolkata"));

// Format the date

var formatter = java.time.format.DateTimeFormatter.ofPattern("u-M-d hh:mm:ss a O");
var string = zonedDateTime.format(formatter);

2
बहुत अधिक कुशल।
चाड बिंघम 18

2
नहीं। सभी विधियां java.util.Dateह्रासमान नहीं हैं। (JDK8 में डेट और टाइम एपीआई में सुधार हुआ है java.time)
आदतनपोस्ट

1
@ राफेलज़ेफ़ा, '' 'तारीख (लंबी तारीख)' '' का निर्माण नहीं हुआ है
गुगेलुफ़

तारीख वस्तु पिछड़े संगतता के लिए प्रदान की जाती है। जैसा कि ऊपर बताया गया है, बेहतर कैलेंडर का उपयोग करें।
टन स्नोई

2
FYI करें, इस तरह के रूप में बहुत परेशानी पुराने तिथि-समय कक्षाएं java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब कर रहे हैं विरासत , द्वारा का स्थान ले लिया java.time जावा 8 और बाद में बनाया गया वर्गों। ओरेकल द्वारा ट्यूटोरियल देखें ।
बेसिल बॉर्क

24

tl; डॉ

Instant.ofEpochMilli( 1_322_018_752_992L )     // Parse count of milliseconds-since-start-of-1970-UTC into an `Instant`.
       .atZone( ZoneId.of( "Africa/Tunis" ) )  // Assign a time zone to the `Instant` to produce a `ZonedDateTime` object.

विवरण

अन्य उत्तर आउटमोडेड या गलत कक्षाओं का उपयोग करते हैं।

पुरानी तारीखों वाली कक्षाओं जैसे कि java.util.Date/.Calendar से बचें। वे खराब रूप से डिजाइन किए गए, भ्रमित और परेशान करने वाले साबित हुए हैं।

java.time

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

एक Instantमें समय रेखा पर एक पल है यूटीसी के एक संकल्प के साथ नैनोसेकंड । यूटीसी में इसकी अवधि 1970 का पहला क्षण है।

अपने इनपुट डेटा को मानकर 1970-01-01T00: 00: 00Z (प्रश्न में स्पष्ट नहीं) से मिलीसेकंड की एक गिनती है, तो हम आसानी से एक का उपयोग कर सकते हैं Instant

Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L );

तत्काल .toString (): 2011-11-23T03: 25: 52.992Z

Zकि मानक में आईएसओ 8601 स्वरूपित स्ट्रिंग के लिए छोटा है Zuluऔर इसका मतलब है यूटीसी

प्राप्त करने के लिए, एक उचित समय क्षेत्र नाम का उपयोग करके समय क्षेत्र लागू करें ZonedDateTime

ZoneId zoneId = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( zoneId );

इस कोड को IdeOne.com पर लाइव देखें ।

Asia/Kolkata समय क्षेत्र ?

मुझे लगता है कि आपके कोड को प्रभावित करने वाले भारत का समय क्षेत्र आपके पास है। हम यहां देखते हैं कि Asia/Kolkataसमय क्षेत्र में समायोजन उसी दिन का समय प्रदान करता है जैसा कि आप रिपोर्ट करते हैं, 08:55जो हमारे यूटीसी मूल्य से साढ़े पांच घंटे आगे है 03:25

2011-11-23T08: 55: 52.992 + 05: 30 [एशिया / कोलकाता]

डिफ़ॉल्ट क्षेत्र

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

ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

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

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

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

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

एक साथ JDBC ड्राइवर के अनुपालन JDBC 4.2 या बाद में, आप का आदान-प्रदान कर सकते हैं java.time अपने डेटाबेस के साथ सीधे वस्तुओं। स्ट्रिंग्स या java.sql के लिए कोई ज़रूरत नहीं है। * कक्षाएं।

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

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


क्या आपके द्वारा सुझाए गए इंस्टेंट को स्थानीय समय क्षेत्र में परिवर्तित करना आसान होगा जो कि डिवाइस पर डिफ़ॉल्ट है (उदाहरण के लिए, एक स्मार्टफ़ोन)?
AJW

1
@AJW हाँ। पुकारते हैं ZoneId.systemDefault()। मेरे उत्तर के अंत में जोड़ा गया नया अनुभाग देखें।
तुलसी बोर्क

बहुत बढ़िया, मैं इसे एक कोशिश करूँगा।
AJW

14

ऐसा करने का सबसे आसान तरीका है, जोडा डेटाइम क्लास का उपयोग करना और मिलीसेकंड में टाइमस्टैम्प और आपके द्वारा इच्छित डेटाइम ज़ोन दोनों को निर्दिष्ट करना।

मैं अंतर्निहित जावा तिथि और कैलेंडर कक्षाओं से बचने की दृढ़ता से सलाह देता हूं; वे भयानक हैं।


जॉर्जियाईकेंडर ने काम नहीं किया ... जिस भी कारण से सिस्टम डिफॉल्ट टाइम ज़ोन हुआ। जोडा ने पूरी तरह से काम किया।
अमित

अगर हम ग्रेगोरियन के साथ कुछ अलग कर सकते हैं तो मुझे सैंपल कोड को देखने दें
अमित

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

13

यदि 1 जनवरी, 1970 GMT के बाद से मिली की संख्या मिलिस की है, जैसा कि JVM के लिए मानक है, तो यह समय क्षेत्र से स्वतंत्र है। यदि आप इसे एक विशिष्ट समय क्षेत्र के साथ प्रारूपित करना चाहते हैं, तो आप इसे ग्रेगोरियन कैलेन्डर ऑब्जेक्ट में बदल सकते हैं और टाइमज़ोन सेट कर सकते हैं। उसके बाद इसे प्रारूपित करने के कई तरीके हैं।


1
यह ग्रेगोरियन कैलेन्डर और जोडा के साथ नमूना कोड है, मुझे जोडा के साथ सही आउटपुट मिल रहा है, लेकिन ग्रेगोरियन ग्रेगोरियन कैलेन्डर कैलेंडर के साथ नहीं = नया ग्रेगोरियन कैलेन्डर (TimeZone.getTimeZone ("यूएस / सेंट्रल")); calendar.setTimeInMillis (yourmilliseconds); DateTime jodaTime = नया DateTime (yourmilliseconds, DateTimeZone.forTimeZone (TimeZone.getTimeZone ("US / Central"))); DateTimeFormatter parser1 = DateTimeFormat.forPattern ("yyyy-MM-dd HH: mm: ss, SSS");
अमित

कैलेंडर ऑब्जेक्ट में टाइम ज़ोन सेट करने से काम नहीं चला, लेकिन इसे डेट फॉर्मेटर ऑब्जेक्ट में सेट किया?
बिल

DateTime और DateTimeFormatter क्या है ??
स्वीटविशर

11

मेरा समाधान

public class CalendarUtils {

    public static String dateFormat = "dd-MM-yyyy hh:mm";
    private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);

    public static String ConvertMilliSecondsToFormattedDate(String milliSeconds){
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(Long.parseLong(milliSeconds));
        return simpleDateFormat.format(calendar.getTime());
    }
}

6

मैं इसे इस तरह से करता हूं:

static String formatDate(long dateInMillis) {
    Date date = new Date(dateInMillis);
    return DateFormat.getDateInstance().format(date);
}

आप getDateInstance(int style)निम्न मापदंडों के साथ भी उपयोग कर सकते हैं :

DateFormat.SHORT

DateFormat.MEDIUM

DateFormat.LONG

DateFormat.FULL

DateFormat.DEFAULT


5

SimpleDateFormat वर्ग में SetTimeZone (TimeZone) नामक एक विधि है जो DateFormat वर्ग से विरासत में मिली है। http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html


FYI करें, उन भयानक वर्गों को अब आधुनिक java.time कक्षाओं द्वारा JSR 310 को अपनाया जाना है।
बेसिल बोर्क


2

नीचे मिलिसेकंड से डेट फॉर्मेट प्राप्त करने का मेरा समाधान है। इस कोड को चलाने के लिए आपको Joda Library का उपयोग करना होगा।

import java.util.GregorianCalendar;
import java.util.TimeZone;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class time {

    public static void main(String args[]){

        String str = "1431601084000";
        long geTime= Long.parseLong(str);
        GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
        calendar.setTimeInMillis(geTime);
        DateTime jodaTime = new DateTime(geTime, 
               DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
        DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd");
        System.out.println("Get Time : "+parser1.print(jodaTime));

   }
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.