वर्तमान के लिए आधी रात के बाद से मुझे मिलीसेकंड की गिनती कैसे मिल सकती है?


125

ध्यान दें, मैं युग से मिलिस नहीं चाहता। मैं घड़ी पर वर्तमान में मिलीसेकंड की संख्या चाहता हूं।

इसलिए, उदाहरण के लिए, मेरे पास यह कोड है।

Date date2 = new Date(); 
Long time2 = (long) (((((date2.getHours() * 60) + date2.getMinutes())* 60 ) + date2.getSeconds()) * 1000);

क्या तारीख के साथ मिलीसेकंड प्राप्त करने का एक तरीका है? क्या इसे करने का और कोई तरीका है?

नोट: System.currentTimeMillis() मुझे युग से मिलिस देता है जो कि मैं नहीं देख रहा हूं।


2
आपका मतलब है, "दूसरे में मिलीसेकंड," इसलिए मूल्य हमेशा अंतराल में होता है [0, 999], सही है? @thinksteep ने आखिरी वाक्य पढ़ा।
मैट बॉल

@ लेमियो एक उदाहरण देने से आपका प्रश्न अधिक स्पष्ट हो जाएगा।
बेसिल बॉर्क

FYI करें, पुरानी पुरानी समय-समय की कक्षाएं जैसे कि java.util.Dateअब विरासत , java.time कक्षाओं द्वारा दबा दी गई हैं।
तुलसी बॉर्क

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

1
@ChrisNeve JEP 150 को ब्रायन गोएट्ज़ ने समर्थन दिया , JSR 310 ने सर्वसम्मति से अपनाया , ओरेकल द्वारा प्रकाशित एक तकनीकी लेख , और नए java.time ट्यूटोरियल के साथ पुराने डेट-ओरेकल ट्यूटोरियल के प्रतिस्थापन ।
बेसिल बोर्के

जवाबों:


198

क्या मतलब है आपका?

long millis = System.currentTimeMillis() % 1000;

BTW विंडोज 1969 के लिए समयरेखा की अनुमति नहीं देता है

C:\> date
Enter the new date: (dd-mm-yy) 2/8/1969
The system cannot accept the date entered.

8
ध्यान दें कि यदि आप यूनिक्स युग से पहले समय में वापस यात्रा करते हैं, तो इसका उपयोग c.get(Calendar.MILLISECOND)न करते हुए एक नकारात्मक मूल्य देगा । हमेशा कोने के मामलों के बारे में सोचो!
जॉन स्कीट

और अगर किसी ने दूसरी सीमा पर
टाइमज़ोन

35
जावा समय यात्रा का समर्थन नहीं करता है।
आर। मार्टिनो फर्नांडिस

1
@MarkusMikkolainen: नहीं, System.currentTimeMillis()समय क्षेत्र से प्रभावित नहीं है।
जॉन स्कीट

1
@PeterLawrey: खैर, यह हो सकता है या नहीं। यह कार्यान्वयन तक है। दिनांक के लिए डॉक्स से: "0 से 61 तक एक पूर्णांक द्वारा एक दूसरे का प्रतिनिधित्व किया जाता है; मान 60 और 61 केवल लीप सेकंड के लिए होते हैं और तब भी केवल जावा कार्यान्वयन में जो वास्तव में लीप सेकंड को सही तरीके से ट्रैक करते हैं। जिस तरीके से लीप में होता है। वर्तमान में सेकंड पेश किए गए हैं, यह बहुत कम संभावना है कि दो लीप सेकंड एक ही मिनट में हो जाएंगे, लेकिन यह विनिर्देश आईएसओ सी के लिए तिथि और समय सम्मेलनों का अनुसरण करता है। "
जॉन स्कीट

25

कैलेंडर का उपयोग करें

Calendar.getInstance().get(Calendar.MILLISECOND);

या

Calendar c=Calendar.getInstance();
c.setTime(new Date()); /* whatever*/
//c.setTimeZone(...); if necessary
c.get(Calendar.MILLISECOND);

व्यवहार में, हालांकि मुझे लगता है कि यह लगभग हमेशा System.currentTimeMillis ()% 1000 के बराबर होगा; जब तक किसी के पास लीप-मिलीसेकंड या कोई कैलेंडर नहीं है, तब तक इसे एक दूसरी सीमा पर नहीं एक युग के साथ परिभाषित किया जाता है।


कैलेंडर पहले से ही डिफ़ॉल्ट रूप से वर्तमान समय है, और MILLISECOND में कोई भी नहीं है।
kagutron


14

tl; डॉ

आप मौजूदा समय के एक सेकंड के अंश के रूप में कई मिलीसेकंड ( युग से गिनती नहीं ) के रूप में पूछते हैं ।

Instant.now()                               // Get current moment in UTC, then…
       .get( ChronoField.MILLI_OF_SECOND )  // interrogate a `TemporalField`.

2017-04-25T03: 01: 14.113Z → 113

  1. नैनोसेकंड (अरबों) में भिन्नात्मक दूसरा प्राप्त करें।
  2. हजार से विभाजित करके मिलीसेकंड (हजारों) में विभाजित करें।

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

Java.time का उपयोग करना

आधुनिक तरीका java.time कक्षाओं के साथ है।

UTC में वर्तमान क्षण कैप्चर करें।

Instant.now()

Instant.getए के मूल्य के लिए पूछताछ करने के लिए विधि का उपयोग करें TemporalField। हमारे मामले में, TemporalFieldहम चाहते हैं ChronoField.MILLI_OF_SECOND

int millis = Instant.now().get( ChronoField.MILLI_OF_SECOND ) ;  // Get current moment in UTC, then interrogate a `TemporalField`.

या गणित स्वयं करें।

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

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

अंश द्वितीय के लिए पूछताछ। यह प्रश्न मिलीसेकंड के लिए पूछा गया था , लेकिन java.time कक्षाएं नैनोसेकंड के महीन संकल्प का उपयोग करती हैं । इसका मतलब है कि नैनोसेकंड की संख्या 0 से लेकर 999,999,999 तक होगी।

long nanosFractionOfSecond = zdt.getNano();

यदि आप वास्तव में मिलीसेकंड चाहते हैं, तो बेहतर डेटा को एक मिलियन से विभाजित करके कम कर दें। उदाहरण के लिए, एक आधा सेकंड 500,000,000 नैनोसेकंड है और 500 मिलीसेकंड भी है।

long millis = ( nanosFractionOfSecond / 1_000_000L ) ;  // Truncate nanoseconds to milliseconds, by a factor of one million.

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

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

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

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

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

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


13

मैंने ऊपर कुछ लोगों की कोशिश की, लेकिन वे @ 1000 रीसेट करने लगते हैं

यह एक निश्चित रूप से काम करता है, और इस वर्ष को भी ध्यान में रखना चाहिए

long millisStart = Calendar.getInstance().getTimeInMillis();

और फिर जरूरत पड़ने पर अंत समय के लिए भी ऐसा ही करें।


1
गलत प्रश्न का उत्तर देना। वह युग से वर्तमान मिलिस है, वर्तमान समय का मिलिस हिस्सा नहीं है।
सीन वान गॉर्डर

5
  1. long timeNow = System.currentTimeMillis();
  2. System.out.println(new Date(timeNow));

शुक्र अप्रैल 04 14:27:05 पीडीटी 2014


3

Joda समय

मुझे लगता है कि आप ऐसा करने के लिए जोडा-टाइम का उपयोग कर सकते हैं । DateTimeकक्षा और उसकी getMillisOfSecondविधि पर एक नज़र डालें । कुछ इस तरह

int ms = new DateTime().getMillisOfSecond() ;

संकलन त्रुटि: " getMillis()संरक्षित पहुंच है"; get()इसके बजाय उपयोग करने की आवश्यकता है । यह भी ध्यान दें कि new DateTime(new Date())बस लिखने के बराबर है new DateTime()
जोनीक

विधि millisOfSecondकिसी ऑब्जेक्ट तक पहुँचती है और उस ऑब्जेक्ट से getएक आदिम निकालने के लिए आगे की कॉल int। तुम्हें पता है, सुविधा गेटर पद्धति का उपयोग करके दो कॉल संक्षिप्त कर सकते हैं getMillisOfSecond। Joda-Time अपने कई गुणों के लिए इस पैटर्न का अनुसरण करता है।
तुलसी बॉर्क

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

0

जावा 8 में आप बस कर सकते हैं

ZonedDateTime.now().toInstant().toEpochMilli()

रिटर्न: 1970-01-01T00: 00: 00Z के युग के बाद से मिलीसेकंड की संख्या


1
[ए] यह वह नहीं है जो प्रश्न ने पूछा है। स्पष्ट रूप से कहते हैं कि वे युग संदर्भ तिथि से मिलीसेकंड की गिनती नहीं चाहते हैं। [बी] आप को छोटा कर सकता है कि ZonedDateTime छोड़ने के द्वारा:Instant.now().toEpochMilli()
तुलसी Bourque

0

मैंने java 8 का उपयोग करते हुए परीक्षण किया, यह अभिप्राय नहीं है कि बिल्डर हमेशा 0 मिलीसेकंड लेता है और 26 और 33 मिलीसेकंड के बीच का कॉनसैट और 1000 कॉनसेनटेशन के पुनरावृत्ति के बीच होता है

आशा है कि यह आपके विचारधारा के साथ प्रयास करने में मदद करेगा

public void count() {

        String result = "";

        StringBuilder builder = new StringBuilder();

        long millis1 = System.currentTimeMillis(),
            millis2;

        for (int i = 0; i < 1000; i++) {
            builder.append("hello world this is the concat vs builder test enjoy");
        }

        millis2 = System.currentTimeMillis();

        System.out.println("Diff: " + (millis2 - millis1));

        millis1 = System.currentTimeMillis();

        for (int i = 0; i < 1000; i++) {
            result += "hello world this is the concat vs builder test enjoy";
        }

        millis2 = System.currentTimeMillis();

        System.out.println("Diff: " + (millis2 - millis1));
    }

0

जावा 8:

LocalDateTime toDate = LocalDateTime.now();
LocalDateTime fromDate = LocalDateTime.of(toDate.getYear(), toDate.getMonth(), 
toDate.getDayOfMonth(), 0, 0, 0);
long millis = ChronoUnit.MILLIS.between(fromDate, toDate);

1
कुछ समय क्षेत्रों में काम नहीं करता है। कुछ क्षेत्रों में, कुछ तिथियों पर, दिन 00:00:00 बजे शुरू नहीं हो सकता है। और दिन 24 घंटे लंबा नहीं हो सकता है, कुछ घंटों या मिनटों को जोड़ या छोड़ सकता है। LocalDateTimeवर्ग एक पल का प्रतिनिधित्व नहीं कर सकते, समय क्षेत्र के किसी भी अवधारणा की कमी या ऑफसेट-से-यूटीसी और इस कारण इन समय क्षेत्र के मुद्दों ट्रैक नहीं कर सकते।
बेसिल बोर्के

0

मिलीसेकंड में समय निकालने के लिए आप java.util.Calendar वर्ग का उपयोग कर सकते हैं। उदाहरण:

Calendar cal = Calendar.getInstance();
int milliSec = cal.get(Calendar.MILLISECOND);
// print milliSec

java.util.Date date = cal.getTime();
System.out.println("Output: " +  new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(date));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.