উত্তর:
Time_t Wikipedia নিবন্ধটি নিবন্ধটি এই কিছু আলোকপাত। নীচের লাইনটি হ'ল time_tসি স্পেসিফিকেশনে প্রকারের গ্যারান্টি নেই।
time_tডাটাটাইপ আইএসও C লাইব্রেরি সিস্টেমের সময় মান জমা করার জন্য সংজ্ঞায়িত একটি ডাটা টাইপ হয়। এই জাতীয় মানগুলি স্ট্যান্ডার্ডtime()লাইব্রেরি ফাংশন থেকে ফিরে আসে । এই টাইপটি স্ট্যান্ডার্ড শিরোনামে সংজ্ঞায়িত একটি টাইপিডেফ। আইএসও সি সময়_টাকে একটি পাটিগণিত ধরণের হিসাবে সংজ্ঞায়িত করে তবে এর জন্য কোনও নির্দিষ্ট ধরণ , ব্যাপ্তি, রেজোলিউশন বা এনকোডিং নির্দিষ্ট করে না । সময় নির্ধারণের জন্য গাণিতিক ক্রিয়াকলাপগুলির অর্থগুলিও অনির্ধারিত।ইউনিক্স এবং পোসিক্স-কমপ্লায়েন্ট সিস্টেমগুলি
time_tটাইপটিsigned integer(সাধারণত 32 বা 64 বিট প্রস্থ) হিসাবে প্রয়োগ করে যা ইউনিক্সের সূচনা হওয়ার পরে সেকেন্ডের সংখ্যা উপস্থাপন করে : 1 জানুয়ারী, 1970 এর মধ্যরাত ইউটিসি (লিপ সেকেন্ড গণনা করা হয়নি)। কিছু সিস্টেম সঠিকভাবে নেতিবাচক সময় মানগুলি পরিচালনা করে, অন্যরা তা করে না। 32-বিটtime_tটাইপ ব্যবহারকারী সিস্টেমগুলি বছর 2038 সালের সমস্যার জন্য সংবেদনশীল ।
time_tঅন-ডিস্ক ডেটা কাঠামো ব্যবহার করে ঘটতে পারে। যাইহোক, যেহেতু ফাইল সিস্টেমগুলি প্রায়শই অন্যান্য অপারেটিং সিস্টেমগুলি দ্বারা পড়া হয়, তাই এই ধরনের বাস্তবায়ন-নির্ভর ধরণের উপর ভিত্তি করে ফাইল সিস্টেমটি সংজ্ঞায়িত করা বোকামি হবে। উদাহরণস্বরূপ, একই ফাইল সিস্টেমটি 32-বিট এবং 64-বিট উভয় সিস্টেমে ব্যবহৃত হতে পারে এবং time_tআকার পরিবর্তন করতে পারে। সুতরাং, ফাইল সিস্টেমগুলি ঠিক ("ইউটিসি-তে 1970 এর শুরু থেকে সেকেন্ডের সংখ্যা প্রদান" 32-বিট স্বাক্ষরিত পূর্ণসংখ্যার ") ঠিক তেমন সংজ্ঞা দেওয়া দরকার time_t।
time.hসামগ্রীর তালিকায় পুনঃনির্দেশ করে । এই নিবন্ধটি সিপ্রেফারেন্স.কমের সাথে লিঙ্ক করেছে তবে উদ্ধৃত সামগ্রীটি কোথাও পাওয়া যায় না…
time_tস্বাক্ষর করেছে তা ভুল। pubs.opengroup.org/onlinepubs/9699919799/basedefs/… নির্দেশ দেয় যে বিভিন্ন জিনিস অবশ্যই "স্বাক্ষরিত পূর্ণসংখ্যা টাইপ" বা "স্বাক্ষরবিহীন পূর্ণসংখ্যা টাইপ" হতে time_tপারে , তবে এর মধ্যে কেবল এটি বলা হয় যে এটি "পূর্ণসংখ্যার ধরণ হবে" । একটি বাস্তবায়ন time_tস্বাক্ষরবিহীন করতে পারে এবং এখনও পসিক্স-সম্মতিযুক্ত হতে পারে।
[root]# cat time.c
#include <time.h>
int main(int argc, char** argv)
{
time_t test;
return 0;
}
[root]# gcc -E time.c | grep __time_t
typedef long int __time_t;
এর $INCDIR/bits/types.hমাধ্যমে সংজ্ঞায়িত করা হয়েছে :
# 131 "/usr/include/bits/types.h" 3 4
# 1 "/usr/include/bits/typesizes.h" 1 3 4
# 132 "/usr/include/bits/types.h" 2 3 4
typedef __int32_t __time_t;এবং typedef __time_t time_t;এ FreeBSD freebsd-test 8.2-RELEASE-p2 FreeBSD 8.2-RELEASE-p2 #8: Sun Aug 7 18:23:48 UTC 2011 root@freebsd-test:/usr/obj/usr/src/sys/MYXEN i386। আপনার ফলাফলগুলি লিনাক্সে স্পষ্টভাবে সেট করা আছে (কমপক্ষে 2.6.32-5-xen-amd64 ডেবিয়ান থেকে)।
__time_tএবং না time_tখুঁজে time_t? এক ধাপ ছাড়ছে?
typedef __time_t time_t;, যদিও ওপি খুঁজে পেয়েছিল , আশেপাশের কোডটি পরীক্ষা করাও নিশ্চিত করা দরকার যে টাইপিডেফ বাস্তবে ব্যবহৃত হয়েছিল এবং এটি কেবল শর্তসাপেক্ষ সংকলনের অংশ ছিল না। typedef long time_t;খুব পাওয়া গেছে।
স্ট্যান্ডার্ড
উইলিয়াম ব্রেন্ডেল উইকিপিডিয়া উদ্ধৃত করেছেন, তবে আমি এটিকে ঘোড়ার মুখ থেকে পছন্দ করি।
C99 N1256 স্ট্যান্ডার্ড খসড়া 7.23.1 / 3 "সময়ের উপাদানগুলি" বলেছেন:
ঘোষিত প্রকারগুলি হ'ল সাইজ_টি (.1.১7 এ বর্ণিত) ক্লক_টি এবং টাইম_টি যা গাণিতিক ধরণের সময়কে উপস্থাপন করতে সক্ষম
এবং 6.2.5 / 18 "প্রকারগুলি" বলেছেন:
পূর্ণসংখ্যা এবং ভাসমান ধরণেরগুলি সম্মিলিতভাবে গাণিতিক প্রকারগুলি বলা হয়।
পসিক্স s টি সাইজ_ টাইপস বলেছেন:
[CX] সময়_t একটি পূর্ণসংখ্যার প্রকার হবে।
যেখানে [CX]হয় হিসাবে সংজ্ঞায়িত :
[সিএক্স] আইএসও সি স্ট্যান্ডার্ডে প্রসারিত।
এটি একটি এক্সটেনশন কারণ এটি আরও দৃ stronger় গ্যারান্টি দেয়: ভাসমান পয়েন্টগুলি বাইরে।
জিসিসি ওয়ান লাইনার
কাসনসুই দ্বারা উল্লিখিত কোনও ফাইল তৈরি করার দরকার নেই :
echo | gcc -E -xc -include 'time.h' - | grep time_t
উবুন্টু 15.10 জিসিসি 5.2 এ শীর্ষ দুটি লাইন হ'ল:
typedef long int __time_t;
typedef __time_t time_t;
থেকে কিছু উদ্ধৃতি সহ কমান্ড বিচ্ছেদ man gcc:
-E: "প্রিপ্রোসেসিং পর্যায়ে পরে থামুন; সংকলকটি সঠিকভাবে চালাবেন না।"-xc: সি ভাষা নির্দিষ্ট করুন, যেহেতু ইনপুট স্টিডিন থেকে আসে যার কোনও ফাইল এক্সটেনশন নেই।-include file: "প্রক্রিয়া ফাইলটি যেন" # অন্তর্ভুক্ত "ফাইল" "প্রাথমিক উত্স ফাইলের প্রথম লাইন হিসাবে উপস্থিত হয়েছিল" "-: স্টিডিন থেকে ইনপুটgcc -E -xc -include time.h /dev/null | grep time_t
উত্তরটি অবশ্যই বাস্তবায়ন-নির্দিষ্ট। আপনার প্ল্যাটফর্ম / সংকলকটির জন্য সুনির্দিষ্টভাবে অনুসন্ধান করতে, কেবলমাত্র আপনার কোডের কোথাও এই আউটপুট যুক্ত করুন:
printf ("sizeof time_t is: %d\n", sizeof(time_t));
যদি উত্তরটি 4 (32 বিট) হয় এবং আপনার ডেটা 2038 ছাড়িয়ে যেতে বোঝায় তবে আপনার কোডটি স্থানান্তর করতে আপনার 25 বছর সময় থাকতে হবে।
আপনি যদি স্ট্রিং হিসাবে আপনার ডেটা সঞ্চয় করেন তবে আপনার ডেটা ঠিক হবে: এমনকি এটি কিছু সাধারণ বিষয় যেমন:
FILE *stream = [stream file pointer that you've opened correctly];
fprintf (stream, "%d\n", (int)time_t);
তারপরে এটি ঠিক একইভাবে পড়ুন (ফ্রেড, fscanf, ইত্যাদি কোনও ইনট মধ্যে), এবং আপনার আপনার সময়কাল অফসেট হবে। নেট। এ একইরকম কাজ রয়েছে। আমি উইন এবং লিনাক্স সিস্টেমের মধ্যে কোনও সমস্যা ছাড়াই (একটি যোগাযোগের চ্যানেলের মাধ্যমে) 64৪-বিট যুগের পাস করি pass এটি বাইট-অর্ডার সংক্রান্ত সমস্যাগুলি নিয়ে আসে তবে এটি অন্য একটি বিষয়।
প্যাক্সিয়াবলোর প্রশ্নের জবাব দেওয়ার জন্য, আমি বলতে পারি যে এটি "19100" মুদ্রিত হয়েছে কারণ প্রোগ্রামটি এভাবে লেখা হয়েছিল (এবং আমি স্বীকার করি যে আমি নিজেই এটি 80 এর দশকে করেছি):
time_t now;
struct tm local_date_time;
now = time(NULL);
// convert, then copy internal object to our object
memcpy (&local_date_time, localtime(&now), sizeof(local_date_time));
printf ("Year is: 19%02d\n", local_date_time.tm_year);
printf"1900 সাল থেকে বছর" দিয়ে একটি শূন্য-প্যাডেড স্ট্রিং দ্বারা অনুসরণ (এর সংজ্ঞা: বিবৃতি সংশোধন STRING "19 বছর হল" ছাপে tm->tm_year)। 2000 সালে, মানটি 100, স্পষ্টতই। "%02d"দুটি শূন্য সহ প্যাডগুলি তবে দুটি সংখ্যার বেশি হলে ছাঁটা হয় না।
সঠিক উপায়টি হ'ল (কেবলমাত্র সর্বশেষ লাইনে পরিবর্তন করুন):
printf ("Year is: %d\n", local_date_time.tm_year + 1900);
নতুন প্রশ্ন: সেই ভাবনার যৌক্তিকতা কী?
%zuফর্ম্যাট স্পেসিফার ব্যবহার করে size_tমানগুলি (যেমন উত্পন্ন sizeof) ফর্ম্যাট করতে ব্যবহার করতে পারেন , কারণ সেগুলি স্বাক্ষরযুক্ত ( u) এবং দৈর্ঘ্যের আকার_t ( z) ·
printf ("sizeof time_t is: %d\n", (int) sizeof(time_t));এবং zসমস্যাটি এড়ান।
ভিজ্যুয়াল স্টুডিও ২০০৮-এর অধীনে, __int64আপনি সংজ্ঞা না দিলে এটি ডিফল্ট হয় _USE_32BIT_TIME_T। আপনি এটির সংজ্ঞা হিসাবে কী জানেন তা জানেন না এমন ভান করে আপনি আরও ভাল, যেহেতু এটি প্ল্যাটফর্ম থেকে প্ল্যাটফর্মে পরিবর্তিত হতে পারে (এবং হবে)।
time_tlong intbit৪ বিট মেশিনে টাইপ করা হয়, অন্যথায় এটিlong long int ।
আপনি এই হেডার ফাইলগুলিতে এটি যাচাই করতে পারেন:
time.h: /usr/include
types.hএবং typesizes.h:/usr/include/x86_64-linux-gnu/bits
(নীচের বিবৃতিগুলি একের পর এক নয় They সেগুলি পাওয়া যাবে C Ctrl + f অনুসন্ধান ব্যবহার করে শিরোনাম ফাইল))
1) সালে time.h
typedef __time_t time_t;
2) types.h
# define __STD_TYPE typedef
__STD_TYPE __TIME_T_TYPE __time_t;
3) ইন typesizes.h
#define __TIME_T_TYPE __SYSCALL_SLONG_TYPE
#if defined __x86_64__ && defined __ILP32__
# define __SYSCALL_SLONG_TYPE __SQUAD_TYPE
#else
# define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE
#endif
4) আবার ভিতরে types.h
#define __SLONGWORD_TYPE long int
#if __WORDSIZE == 32
# define __SQUAD_TYPE __quad_t
#elif __WORDSIZE == 64
# define __SQUAD_TYPE long int
#if __WORDSIZE == 64
typedef long int __quad_t;
#else
__extension__ typedef long long int __quad_t;
long intসর্বত্র নয় । Stackoverflow.com/questions/384502/…
এটি বেশিরভাগ লিগ্যাসি প্ল্যাটফর্মগুলিতে একটি 32-বিট স্বাক্ষরিত পূর্ণসংখ্যার প্রকার। তবে, এটি আপনার কোডটি বছর 2038 বাগ থেকে ভোগাচ্ছে । সুতরাং আধুনিক সি গ্রন্থাগারগুলি এটিকে পরিবর্তে একটি স্বাক্ষরিত 64৪-বিট ইন্ট হিসাবে সংজ্ঞায়িত করা উচিত যা কয়েক বিলিয়ন বছর ধরে নিরাপদ।
সাধারণত আপনি জিডির জন্য bitsবা asmশিরোলেখ ডিরেক্টরিতে অন্তর্নিহিত বাস্তবায়ন-নির্দিষ্ট টাইপডেফগুলি পাবেন । আমার জন্য, এটা /usr/include/x86_64-linux-gnu/bits/types.h।
আপনি কেবল গ্রেপ করতে পারেন, বা কোন নির্দিষ্ট শিরোনাম দেখার জন্য কাসনোইয়ের প্রস্তাবিত প্রিপ্রোসেসর অনুরোধটি ব্যবহার করতে পারেন।
টাইমডিফ টাইমডিফ শেষ পর্যন্ত কি?
জোরালো কোড টাইপ কি তা যত্ন করে না।
সি প্রজাতি time_tএকটি হতে বাস্তব টাইপ মত double, long long, int64_t, int, ইত্যাদি
এটি এমনকি হতে পারে unsignedহিসাবে অনেক সময় ফাংশন থেকে ফেরত মান ইঙ্গিত ত্রুটি নয় -1, কিন্তু(time_t)(-1) - এই বাস্তবায়ন পছন্দটি অস্বাভাবিক।
মুল বক্তব্যটি হ'ল "জানা দরকার" টাইপটি বিরল। প্রয়োজন এড়াতে কোড লেখা উচিত।
তবুও একটি সাধারণ "জানা দরকার" ঘটে যখন কোড কাঁচা মুদ্রণ করতে চায় time_t। বিস্তৃত পূর্ণসংখ্যার ধরণে কাস্টিং বেশিরভাগ আধুনিক কেসগুলিকে সামঞ্জস্য করবে।
time_t now = 0;
time(&now);
printf("%jd", (intmax_t) now);
// or
printf("%lld", (long long) now);
একটিতে কাস্ট করা doubleবা long doubleখুব কার্যকর হবে, তবুও অক্ষত দশমিক আউটপুট সরবরাহ করতে পারে
printf("%.16e", (double) now);
double difftime(time_t time1, time_t time0)একটি অভিন্ন বিয়োগ পদ্ধতির জন্য সরবরাহ করে।
time_tকেবল typedef8 বাইট ( long long/__int64) এর জন্য যা সমস্ত সংকলক এবং ওএস বুঝতে পারে। দিনগুলিতে, এটি কেবল long int(4 বাইট) জন্য ব্যবহৃত হত তবে এখন নয়। আপনি তাকান তাহলে time_tএ crtdefs.hআপনি উভয় বাস্তবায়নের পাবেন কিন্তু ওএস ব্যবহার করবে long long।
long int।