১৯ Java০ সাল থেকে জাভা যেমন পায় তেমনিভাবে কীভাবে বর্তমান টাইমস্ট্যাম্প পাবেন


134

জাভাতে, আমরা System.currentTimeMillis()যুগের সময় থেকে মিলিসেকেন্ডে বর্তমান টাইমস্ট্যাম্পটি পেতে ব্যবহার করতে পারি - যা

বর্তমান সময় এবং মধ্যরাতের মধ্যে, জানুয়ারি 1, 1970 ইউটিসি-র মধ্যে পার্থক্যটি মিলি সেকেন্ডে পরিমাপ করা হয়।

সি ++ তে একই জিনিস কীভাবে পাবেন?

বর্তমান টাইমস্ট্যাম্প পেতে বর্তমানে আমি এটি ব্যবহার করছি -

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

আপনার যদি সি ++ 11 লাইব্রেরিতে অ্যাক্সেস থাকে তবে std::chronoলাইব্রেরিটি দেখুন। আপনি এটি ইউনিক্স যুগের পর থেকে মিলিসেকেন্ডগুলি পেতে এটি ব্যবহার করতে পারেন:

#include <chrono>

// ...

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

92
খুশী হলাম। একটি মৌলিক ধরণের বিন্যাসে মিলিসেকেন্ডের সংখ্যা পেতে লাইনের শেষে গণনা () যুক্ত করুন।
পি 1 আর 4 এএন 4

1
@ লাইনিং: উভয় যুগই একই রকম হতে পারে তবে তাদের মান আলাদা হতে পারে। steady_clockসর্বদা অগ্রসর হবে, এটি যুগের পর থেকে এটি সময়ের সত্য পরিমাপ, system_clockযদিও এটি যুগের পর থেকে যৌক্তিক সময়ের উপস্থাপনা হতে পারে। প্রতিটি লিপ সেকেন্ডের জন্য দুটি সিস্টেমের প্রয়োগের উপর নির্ভর করে আরও বাড়তে পারে।
ওজ

4
আমি যতদূর জানি, প্রতিটি ঘড়ির জন্য যুগটি বাস্তবায়ন নির্ভর। কনভেনশনটি system_clockইউনিক্সের যুগের সমান হতে পারে, তবে কেবল অনুমানটিই বলেছে এটি অবশ্যই সিস্টেম-ওয়াইড রিয়েল টাইম ওয়ালের ঘড়ি হতে হবে। 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;

এটি উল্লেখ করুন


ভাল সমাধান, এছাড়াও আমি মনে করি এটি গেটটাইমডে (& টিপি, এনইউএল) হওয়া উচিত;
এ্যাডেম

4
প্রথমত, এটি সি, সি ++ নয়। দ্বিতীয়ত, সেখানে gettimeofday সঙ্গে সমস্যা হয়, দেখুন এই উদাহরণস্বরূপ।
rustyx

17

এই উত্তরটি ও-এর মতো বেশিরভাগ অনুরূপ , <chrono>সি ++ এর জন্য ব্যবহার করে - আমি ওজ থেকে এটি ধরিনি। যদিও ...

আমি এই পৃষ্ঠার নীচে মূল স্নিপেটটি তুলেছি এবং এটি সম্পূর্ণ কনসোল অ্যাপ্লিকেশন হিসাবে সামান্য পরিবর্তন করেছি। আমি এই লিল 'ওল' জিনিসটি ব্যবহার করতে পছন্দ করি। আপনি যদি প্রচুর স্ক্রিপ্টিং করেন এবং ভিবি বা কিছু কম আধুনিক, কম পাঠক-বান্ধব কোড ব্যবহার না করে প্রকৃত মিলি সেকেন্ডে পর্ব পেতে উইন্ডোজের একটি নির্ভরযোগ্য সরঞ্জাম প্রয়োজন তবে এটি দুর্দান্ত।

#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এটি ঠিক নয়, তাই না?
নোটিডার্ট

1
@ নাইটিডার্ট আপনি কি প্ল্যাটফর্ম এবং সি ++ সংকলক ব্যবহার করছেন তা আমাকে বলতে পারেন? আমি অটোমেশন সরঞ্জামগুলির সাথে এই জিনিসটি সর্বদা ব্যবহার করি এবং কখনও নেতিবাচক আউটপুট দেখিনি .0.০ যদিও এটি যাচাই করে খুশি। এছাড়াও, এটি কি একটি সরাসরি অনুলিপি, বা সংশোধিত / সংহত প্রোগ্রাম? এটি কেবলমাত্র এই কোড থেকে উদ্ভূত হয়েছে তা নিশ্চিত করতে চান।
kayleeFrye_onDeck

5
আহ @ কেলেলিফ্রি_ডোন এর কারণ আমি ব্যবহার করছিলাম int! int nowms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();। আমি যে swithced int64_tএবং এটি কাজ করে! সাহায্যের জন্য আরও তথ্যের জন্য জিজ্ঞাসা করার জন্য অনেক ধন্যবাদ!
Noitidart

unsigned long longআরও বহনযোগ্য, এবং __int64শুধুমাত্র এমএসভিসি তে উপলব্ধ।
এসএস অ্যান

__int64স্ট্যান্ডার্ড সি ++ তে কোনও ধরণের নেই । std::int64_tপরিবর্তে একটি ব্যবহার করতে পারেন ।
jaskmar

14

যেহেতু সি ++ 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
এটি যুগের পর থেকে কয়েক সেকেন্ড ফিরে আসে। মিলিসেকেন্ড নয়।
প্রগো 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.