ফর্ম্যাটে কীভাবে সময় প্রিন্ট করতে হবে: ২০০৯-০৮-১০ 18: 17: 54.811


উত্তর:


109

স্ট্রফটাইম () ব্যবহার করুন ।

#include <stdio.h>
#include <time.h>

int main()
{
    time_t timer;
    char buffer[26];
    struct tm* tm_info;

    timer = time(NULL);
    tm_info = localtime(&timer);

    strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info);
    puts(buffer);

    return 0;
}

মিলিসেকেন্ড অংশের জন্য, এই প্রশ্নটি একবার দেখুন। এএনএসআই সি ব্যবহার করে মিলি সেকেন্ডে সময় কীভাবে পরিমাপ করা যায়?


এটি এখন আরও উত্তম উত্তর এবং মিলিসেকেন্ড অংশটি কীভাবে পরিচালনা করতে হবে তা অনুসন্ধানের জন্য প্রপস। যদিও আমি মনে করি আপনার বাফারটি এটি হওয়া দরকারের তুলনায় এখন কিছুটা দীর্ঘ।
জ্যাক কেলি

16
বেটার চেয়ে খাটো :-) আর হতে
paxdiablo

চমত্কার উত্তর। আমি পিএইচপি-তে সমস্ত ধরণের জিনিস করতে পারতাম, তবে জানতাম এটি সি-তে ইতিমধ্যে ছিল in ধন্যবাদ।
বিজয় কুমার কান্ত

4
সম্ভবত লাইনটি কমপক্ষে লিনাক্সের জন্য time(&timer)হওয়া উচিত timer = time(NULL);The tloc argument is obsolescent and should always be NULL in new code. When tloc is NULL, the call cannot fail.
আন্তোনিন ডাসিমো

6
লোকালটাইম () দ্বারা ব্যবহৃত "স্ট্রাক্ট টিএম" হিসাবে কমপক্ষে একটি ক্ষেত্রে (লিনাক্স) উত্তর উত্তর অবশ্যই ভুল। গেটটাইমডে () দ্বারা ব্যবহৃত "স্ট্রাক্ট সময়কাল" এর পরিবর্তে মাইক্রোসেকেন্ড রয়েছে যা 1000 দ্বারা বিভক্ত হয়ে মিলিসেকেন্ড তৈরি করবে। এই সমস্ত upvotes সত্যিই ভুল এবং বিভ্রান্তিমূলক! "স্ট্রাক্ট টিএম" দিয়ে আপনি কোনটির নীচে সময়ের বিবরণটি পাবেন না যদি না কোনও আর্কিটেকচারের অধীনে রিপোর্ট করে।
এনজেওআর

32

উপরের উত্তরগুলি পুরোপুরি প্রশ্নের উত্তর দেয় না (বিশেষত মিলিসেক অংশ)। এর আমার সমাধানটি হ'ল স্ট্রফটাইমের আগে গেটটাইম ডে ব্যবহার করা। মিলিসেকের জন্য "1000" এড়াতে যত্নের নোট করুন। এটি হামিদ নাজারির উত্তরের ভিত্তিতে তৈরি।

#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <math.h>

int main() {
  char buffer[26];
  int millisec;
  struct tm* tm_info;
  struct timeval tv;

  gettimeofday(&tv, NULL);

  millisec = lrint(tv.tv_usec/1000.0); // Round to nearest millisec
  if (millisec>=1000) { // Allow for rounding up to nearest second
    millisec -=1000;
    tv.tv_sec++;
  }

  tm_info = localtime(&tv.tv_sec);

  strftime(buffer, 26, "%Y:%m:%d %H:%M:%S", tm_info);
  printf("%s.%03d\n", buffer, millisec);

  return 0;
}

gettimeofdayউইন্ডোজ বাস্তবায়নে উপলভ্য নয়
মেন্ডেস

আপনি এটি তৈরি করার সময় দয়া করে '-lm' বিকল্পগুলি যুক্ত করুন।
স্কাইসাইন

4
আমি মনে করি যে বাফার [24] হয় যথেষ্ট, কারণ নীচে মত, হল YYYY: এম এম: ডিডি HH: MM: SS.mmm + + '\ 0', 24. হয়
skysign

@ মেন্ডেস, কেন উইন্ডোজ উল্লেখ করছেন? প্রশ্নটি সরল সি ভাষা সম্পর্কে। এই সমস্ত ভুল উপক্রম হওয়া সত্ত্বেও এটি একটি ভাল উত্তর (যদিও সঠিক নয়)!
এনজোরআর

4
ব্যবহারকারী 3624334: না, আপনি কোডটি বুঝতে পারেন না। সময়ের জন্য কেবল একটি অনুরোধ আছে। আমি ধরে নিলাম আপনার লোকালটাইম কলটি বোঝানো হয়েছে - এটি কেবল গেটটাইমডে থেকে আউটপুটটিকে পুনরায় রূপ দেয়।
ক্রিস

12

time.hএকটি strftimeফাংশন সংজ্ঞা দেয় যা আপনাকে time_tএমন কিছু ব্যবহার করে একটি পাঠ্য উপস্থাপনা দিতে পারে:

#include <stdio.h>
#include <time.h>
int main (void) {
    char buff[100];
    time_t now = time (0);
    strftime (buff, 100, "%Y-%m-%d %H:%M:%S.000", localtime (&now));
    printf ("%s\n", buff);
    return 0;
}

তবে এটি আপনাকে সাব-সেকেন্ড রেজোলিউশন দেয় না কারণ এটি কোনও থেকে পাওয়া যায় না time_t। এটি ফলাফল:

2010-09-09 10:08:34.000

যদি আপনি সত্যিই চশমা দ্বারা সীমাবদ্ধ থাকেন এবং দিন এবং ঘন্টাগুলির মধ্যে স্থান না চান তবে কেবল বিন্যাসের স্ট্রিং থেকে এটি সরিয়ে দিন।


মিলিসেকেন্ডে প্রদর্শনটি পূরণ করার জন্য সমীচীন কৌশলটির জন্য +1। আমার একবার গ্রাহক ছিল যে আমাকে এটি করতে চেয়েছিল, তবে শূন্য-অংকের অঙ্কের সাথে তাই দেখে মনে হয়েছিল যে সেখানে তাত্পর্য রয়েছে। আমি তার বাইরে কথা বললাম তবে শূন্য লাগাতে রাজি হয়েছি।
RBerteig

4
আমার এক বন্ধু (অবশ্যই আমি নয়) একবার একই কৌশল ব্যবহার করেছিল - তারা শেষ দ্বিতীয় এবং "মিলিসেকেন্ড" সম্বলিত স্ট্যাটিকস রেখেছিল। যেখানে দ্বিতীয়বারটি শেষ সময় থেকে পরিবর্তিত হয়নি, তারা মাত্র 1 থেকে 200 এর মধ্যে মিলিসেকের মধ্যে একটি এলোমেলো মান যুক্ত করেছে (এটি অবশ্যই 999 এর আগে চলেছে না তা নিশ্চিত করে - র্যান্ডের জন্য প্রকৃত সর্বোচ্চ সর্বদা সর্বনিম্ন মিনিট ছিল) 999 থেকে 200 এবং অর্ধেক দূরত্ব)। যেখানে দ্বিতীয়টি পরিবর্তিত হয়েছিল, তারা অ্যাডের আগে মাত্র 0 মিলিতে সেট করে। দুর্দান্ত আপাতদৃষ্টিতে এলোমেলো তবে সঠিকভাবে সিক্যুয়ালড মিলিসেকেন্ড এবং গ্রাহক কোনও বুদ্ধিমান ছিলেন না :-)
প্যাক্সিডিয়াবলো

5

মাইক্রোসেকেন্ড যথার্থতার সাথে নিম্নলিখিত কোডের মুদ্রণগুলি। আমাদের যা করতে হবে তা হল বিল্ড স্ট্রিং ব্যবহার gettimeofdayএবং strftimeচালু tv_secএবং সংযোজন tv_usec

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int main(void) {
    struct timeval tmnow;
    struct tm *tm;
    char buf[30], usec_buf[6];
    gettimeofday(&tmnow, NULL);
    tm = localtime(&tmnow.tv_sec);
    strftime(buf,30,"%Y:%m:%dT%H:%M:%S", tm);
    strcat(buf,".");
    sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
    strcat(buf,usec_buf);
    printf("%s",buf);
    return 0;
}

2

আপনি ব্যবহার করতে পারেন strftime, তবে struct tmকয়েক সেকেন্ডের জন্য রেজোলিউশন নেই। এটি নিশ্চিতভাবে আপনার প্রয়োজনের জন্য প্রয়োজন কিনা তা আমি নিশ্চিত নই।

struct tm tm;
/* Set tm to the correct time */
char s[20]; /* strlen("2009-08-10 18:17:54") + 1 */
strftime(s, 20, "%F %H:%M:%S", &tm);

2

কৌশল:

    int time_len = 0, n;
    struct tm *tm_info;
    struct timeval tv;

    gettimeofday(&tv, NULL);
    tm_info = localtime(&tv.tv_sec);
    time_len+=strftime(log_buff, sizeof log_buff, "%y%m%d %H:%M:%S", tm_info);
    time_len+=snprintf(log_buff+time_len,sizeof log_buff-time_len,".%03ld ",tv.tv_usec/1000);

4
কেন এটি কাজ করে তা দয়া করে বিশদ দিন। এবং ঠিক কি চলছে
রাজ কমল

উপরের উদাহরণগুলির মতো সমস্ত, তবে কেবল আরও কার্যকরভাবে। `সময়_লেন + = স্নিপ্রিন্টফ (লগ_বফ + টাইম_লেন, আকারের লগ_বফ-টাইম_লেন," লগ ভার্জ =% s ", লগভার); int ret = Writ (লগ_এফডি, লগ_বফ, টাইম_লেন); `
Мельников

আমি কোথা থেকে getTimeofday আমদানি করব?
AndreyP

1

এই পৃষ্ঠার কোনও সমাধানই আমার পক্ষে কাজ করেনি, আমি সেগুলি মিশ্রিত করেছি এবং তাদের উইন্ডোজ এবং ভিজ্যুয়াল স্টুডিও 2019 এর সাথে কাজ করতে প্রস্তুত করেছি, এখানে কীভাবে:

#include <Windows.h>
#include <time.h> 
#include <chrono>

static int gettimeofday(struct timeval* tp, struct timezone* tzp) {
    namespace sc = std::chrono;
    sc::system_clock::duration d = sc::system_clock::now().time_since_epoch();
    sc::seconds s = sc::duration_cast<sc::seconds>(d);
    tp->tv_sec = s.count();
    tp->tv_usec = sc::duration_cast<sc::microseconds>(d - s).count();
    return 0;
}

static char* getFormattedTime() {
    static char buffer[26];

    // For Miliseconds
    int millisec;
    struct tm* tm_info;
    struct timeval tv;

    // For Time
    time_t rawtime;
    struct tm* timeinfo;

    gettimeofday(&tv, NULL);

    millisec = lrint(tv.tv_usec / 1000.0);
    if (millisec >= 1000) 
    {
        millisec -= 1000;
        tv.tv_sec++;
    }

    time(&rawtime);
    timeinfo = localtime(&rawtime);

    strftime(buffer, 26, "%Y:%m:%d %H:%M:%S", timeinfo);
    sprintf_s(buffer, 26, "%s.%03d", buffer, millisec);

    return buffer;
}

ফলাফল :

2020: 08: 02 06: 41: 59.107

2020: 08: 02 06: 41: 59.196

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.