1970 से मिलीसेकंड में वर्तमान टाइमस्टैम्प कैसे प्राप्त करें जिस तरह से जावा को प्राप्त होता है


134

जावा में, हम System.currentTimeMillis()वर्तमान समय के बाद से मिलिससेकंड में वर्तमान टाइमस्टैम्प प्राप्त करने के लिए उपयोग कर सकते हैं जो कि है -

अंतर, मिलीसेकंड में मापा जाता है, वर्तमान समय और आधी रात के बीच, 1 जनवरी, 1970 यूटीसी।

C ++ में समान चीज़ कैसे प्राप्त करें?

वर्तमान में मैं इसका उपयोग वर्तमान टाइमस्टैम्प प्राप्त करने के लिए कर रहा हूँ -

struct timeval tp;
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000; //get current timestamp in milliseconds

cout << ms << endl;

ये सही लग रहा है या नहीं?

जवाबों:


239

यदि आपके पास C ++ 11 लाइब्रेरी तक पहुंच है, तो std::chronoलाइब्रेरी देखें। आप इसे यूनिक्स युग के बाद से मिलीसेकंड प्राप्त करने के लिए उपयोग कर सकते हैं:

#include <chrono>

// ...

using namespace std::chrono;
milliseconds ms = duration_cast< milliseconds >(
    system_clock::now().time_since_epoch()
);

92
अच्छा लगा। मूलभूत प्रकार के प्रारूप में मिलीसेकंड की संख्या प्राप्त करने के लिए पंक्ति के अंत में गिनती () जोड़ें।
P1r4nh4

1
@ अस्तर: दोनों युग समान होने की संभावना है, लेकिन उनके मूल्य अलग-अलग हो सकते हैं। steady_clockहमेशा आगे बढ़ेगा, यह उसके युग के बाद के समय का सही माप है जबकि युग के system_clockबाद से तार्किक समय का प्रतिनिधित्व हो सकता है। प्रत्येक लीप सेकेंड के लिए सिस्टम के कार्यान्वयन के आधार पर दोनों अलग हो सकते हैं।
ओज।

4
जहाँ तक मुझे पता है, घड़ियों में से प्रत्येक के लिए युग कार्यान्वयन पर निर्भर है। कन्वेंशन system_clockUNIX युग के समान है, लेकिन कल्पना केवल यह कहती है कि यह सिस्टम-वाइड रीयल टाइम वॉल घड़ी होनी चाहिए। steady_clockवास्तविकता से मेल खाने की कोई आवश्यकता नहीं है, केवल यह कि वह केवल आगे बढ़े।
ओज।

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

3
जावास्क्रिप्ट डेवलपर्स यह देखकर मुझे
हँसा

42

उपयोग <sys/time.h>

struct timeval tp;
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;

उल्लेख इस


अच्छा समाधान, मुझे भी लगता है कि यह gettimeofday (& tp, NULL) होना चाहिए;
Adem

4
सबसे पहले, यह C है, C ++ नहीं। दूसरे, गेटटाइमफीड के साथ समस्याएं हैं, उदाहरण के लिए इसे देखें ।
रस्टीक्स

17

इस उत्तर सुंदर के समान है । ओज की , का उपयोग करते हुए <chrono>सी ++ के लिए - मैं ओज से यह हड़पने नहीं किया। हालांकि...

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

#include <chrono>
#include <iostream>

int main() {
    unsigned __int64 now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
    std::cout << now << std::endl;
    return 0;
}

मुझे एक नकारात्मक संख्या मिलती -560549313है यह सही नहीं है, है ना?
Noitidart

1
@Noitidart क्या आप मुझे बता सकते हैं कि आप किस प्लेटफ़ॉर्म और C ++ कंपाइलर का उपयोग कर रहे हैं? मैं हर समय स्वचालन उपकरण के साथ इस चीज का उपयोग करता हूं, और हालांकि इसे जांचने के लिए खुश से अधिक नकारात्मक आउटपुट o.0 नहीं देखा है। इसके अलावा, यह है कि एक सीधी प्रतिलिपि, या संशोधित / एकीकृत कार्यक्रम? बस यह सुनिश्चित करना चाहते हैं कि यह इस कोड से ही उत्पन्न हो।
kayleeFrye_onDeck

5
आह @kayleeFrye_onDeck क्योंकि मैं उपयोग कर रहा था int! int nowms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();। मैंने कहा कि int64_tयह काम करता है! मदद करने के लिए और अधिक जानकारी मांगने के लिए बहुत बहुत धन्यवाद!
Noitidart

unsigned long longअधिक पोर्टेबल है, और __int64केवल MSVC पर उपलब्ध है।
एसएस ऐनी

__int64मानक C ++ में कोई प्रकार नहीं है। एक के std::int64_tबजाय उपयोग कर सकते हैं ।
जस्कमर

14

C ++ 11 के बाद से आप उपयोग कर सकते हैं std::chrono:

  • वर्तमान प्रणाली समय प्राप्त करें: std::chrono::system_clock::now()
  • युग से अब तक का समय: .time_since_epoch()
  • अंतर्निहित इकाई को मिलीसेकंड में अनुवाद करें: duration_cast<milliseconds>(d)
  • std::chrono::millisecondsपूर्णांक में अनुवाद करें ( uint64_tअतिप्रवाह से बचने के लिए)
#include <chrono>
#include <cstdint>
#include <iostream>

uint64_t timeSinceEpochMillisec() {
  using namespace std::chrono;
  return duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
}

int main() {
  std::cout << timeSinceEpochMillisec() << std::endl;
  return 0;
}

मैं unsigned long longइसके बजाय उपयोग करने का सुझाव देता हूं uint64_t
सीएसजी

13

यदि गेटटाइमऑफडे का उपयोग करना है तो आपको लंबे समय तक कास्ट करना होगा अन्यथा आप ओवरफ्लो हो जाएंगे और इस प्रकार युग के बाद से मिलीसेकंड की वास्तविक संख्या नहीं होगी: लंबे समय तक इंट मिंट = tp.tv_sec * 1000 + tp.tv_usec / 1000; आपको 767990892 जैसा नंबर देगा, जो युगांतर के 8 दिन बाद है ;-)

int main(int argc, char* argv[])
{
    struct timeval tp;
    gettimeofday(&tp, NULL);
    long long mslong = (long long) tp.tv_sec * 1000L + tp.tv_usec / 1000; //get current timestamp in milliseconds
    std::cout << mslong << std::endl;
}

-25

फ़ंक्शन को शामिल करें <ctime>और उपयोग करें time


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