- 1 1. परिचय
- 2 2. C Gengo मा समयलाई ह्यान्डल गर्नको आधारभूत ज्ञान
- 3 3. वर्तमान समय प्राप्त गर्ने तरिका
- 4 4. समयको ढाँचा: strftime() को प्रयोग
- 5 5. समयको जोड‑घट
- 6 6. 2038-nen समस्या को तयारी
- 7 7. व्यावहारिक उपयोग केसहरू
- 8 8. अक्सर सोधिने प्रश्न (FAQ)
- 8.1 Q1. वर्तमान समयलाई जापान समय (JST) मा कसरी प्राप्त गर्ने?
- 8.2 Q2. समयलाई मिलिसेकेन्ड इकाइमा प्राप्त गर्न सकिन्छ?
- 8.3 Q3. डेलाइट सेविंग टाइम (DST) लाई कसरी समर्थन गर्ने?
- 8.4 Q4. strftime() द्वारा जापानी भाषा को हप्ता दिन देखाउन सकिन्छ?
- 8.5 Q5. 2038 वर्षपछि समयलाई सही रूपमा कसरी ह्यान्डल गर्ने?
- 8.6 Q6. कार्यक्रमले अपेक्षित समय नदेखाएमा कारण के हो?
- 8.7 सारांश
- 8.8 अर्को खण्डमा, सम्पूर्ण लेखको सारांश गरिनेछ, र सिकेको सामग्रीलाई छोटकरीमा पुनरावलोकन गरिनेछ।
- 9 9. सारांश
1. परिचय
C भाषा प्रणाली प्रोग्रामिङ र एम्बेडेड प्रणालीहरूमा व्यापक रूपमा प्रयोग हुने प्रोग्रामिङ भाषा हो। त्यसमा, “समयलाई ह्यान्डल गर्ने” कुरा धेरै प्रोग्रामहरूमा महत्वपूर्ण तत्व हो। उदाहरणका लागि, वर्तमान समय देखाउने लग प्रणाली, निर्दिष्ट समयमा विशेष प्रक्रिया चलाउने टाइमर कार्यक्षमता आदि, विभिन्न प्रयोगहरूमा समय प्रक्रिया आवश्यक पर्छ।
यस लेखमा, C भाषा मा समयलाई ह्यान्डल गर्दा प्रयोग हुने मानक पुस्तकालय “time.h” लाई केन्द्रित गरी व्याख्या गर्नेछौं। यो पुस्तकालय प्रयोग गरेर, प्रणालीको वर्तमान समय प्राप्त गर्न, समयलाई ढाँचाबद्ध गरी देखाउन सकिन्छ। साथै, भविष्यको चुनौतीको रूपमा चिनिने “2038-nen Mondai” बारे पनि चर्चा गरी, समय प्रक्रियालाई सही रूपमा कार्यान्वयन गर्न आवश्यक आधारभूत ज्ञान सिक्न सकिन्छ।
शुरूवात गर्नेहरू पनि बुझ्न सकून् भनेर, आधारभूत अवधारणाबाट व्यावहारिक प्रयोग उदाहरणसम्म क्रमशः व्याख्या गर्नेछौं। यो लेख पढेर, तलका सामग्रीहरू सिक्न सक्नुहुन्छ:
- C भाषामा समय प्रशोधनको लागि आवश्यक आधारभूत ज्ञान
- वर्तमान समय प्राप्ति र प्रदर्शन
- समयको फर्म्याट र सञ्चालन विधि
- समयसँग सम्बन्धित सामान्य समस्याहरू र तिनीहरूको समाधान
यी ज्ञानलाई प्रयोग गरेर, लग रेकर्ड, शेड्युलिङ, टाइमर आदि विभिन्न परिस्थितिहरूमा उपयोगी समय प्रक्रिया कार्यान्वयन गर्न सकिनेछ। अर्को खण्डमा, C भाषामा समयलाई ह्यान्डल गर्दा प्रयोग हुने आधारभूत डेटा प्रकार र कार्यहरूबारे विस्तृत रूपमा हेर्नेछौं।
2. C Gengo मा समयलाई ह्यान्डल गर्नको आधारभूत ज्ञान
C Gengo मा समयलाई ह्यान्डल गर्न, मानक पुस्तकालयमा समावेश गरिएको 「time.h」 प्रयोग गरिन्छ। यो हेडर फाइलले प्रणालीको समय प्राप्त र सञ्चालन गर्नका लागि डेटा प्रकार र कार्यहरू प्रदान गर्दछ। यहाँ, समय प्रक्रिया गर्न आवश्यक आधारभूत ज्ञानलाई विस्तृत रूपमा व्याख्या गरिन्छ।
time.h भनेको के हो?
time.h
C Gengo मा समय प्रक्रिया समर्थन गर्ने मानक पुस्तकालय हो। यो पुस्तकालय प्रयोग गर्दा, वर्तमान प्रणाली समयको प्राप्ति, समय डेटा फर्म्याट, जोड/घट आदि, विस्तृत समय सम्बन्धी प्रक्रिया सजिलै कार्यान्वयन गर्न सकिन्छ।
मुख्य रूपमा प्रयोग हुने डेटा प्रकार र कार्यहरू तलका जस्तै छन्:
- डेटा प्रकार: 、
- फङ्सन: , , आदि
समय प्रक्रियामा प्रयोग हुने मुख्य डेटा प्रकारहरू
C Gengo मा समयलाई ह्यान्डल गर्नका लागि, तलका डेटा प्रकारहरू बुझ्न आवश्यक छ।
1. time_t
time_t
प्रणाली समयलाई प्रतिनिधित्व गर्ने डेटा प्रकार हो। यो प्रकारले 1970 जनवरी 1 0:0:0 (Unix Epoch) देखि बितेको सेकेन्डहरू राख्दछ। प्रोग्राममा वर्तमान समय प्राप्त गर्दा, पहिलो प्रयोग हुने आधारभूत प्रकार हो।
उदाहरण प्रयोग
#include
#include
int main() {
time_t now = time(NULL); // वर्तमान समय प्राप्त
printf("वर्तमान समय(सेकेन्ड):%ld
", now);
return 0;
}
यो कोडले वर्तमान प्रणाली समयलाई सेकेन्डको रूपमा देखाउँछ।
2. struct tm
struct tm
समयलाई अझ विस्तृत रूपमा प्रतिनिधित्व गर्ने संरचना हो। यस संरचनाले वर्ष, महिना, दिन, घण्टा, मिनेट, सेकेन्ड जस्ता जानकारी समेट्छ।
संरचना सदस्यहरू
struct tm
मा तलका सदस्यहरू समावेश छन्:
tm_sec
tm_min
tm_hour
tm_mday
tm_mon
tm_year
tm_wday
tm_yday
tm_isdst
उदाहरण प्रयोग
#include
#include
int main() {
time_t now = time(NULL);
struct tm *local = localtime(&now); // स्थानीय समयमा रूपान्तरण
printf("वर्तमान मिति र समय: %d-%02d-%02d %02d:%02d:%02d
",
local->tm_year + 1900, // वर्ष 1900 को आधार
local->tm_mon + 1, // महिना 0 बाट सुरु हुन्छ
local->tm_mday,
local->tm_hour,
local->tm_min,
local->tm_sec);
return 0;
}
यो कोडले वर्तमान मिति र समयलाई “YYYY-MM-DD HH:MM:SS” ढाँचामा देखाउँछ।
समय मापनमा प्रयोग हुने अन्य डेटा प्रकारहरू
1. clock_t
clock_t
प्रक्रिया चलाउने समय मापन गर्नको लागि डेटा प्रकार हो। clock()
कार्यसँग संयोजन गरेर प्रयोग गर्दा, कोडको चलाउने समय मापन गर्न सकिन्छ।
उदाहरण प्रयोग
#include
#include
int main() {
clock_t start, end;
double cpu_time_used;
start = clock();
// मापन लक्ष्य कोड
for (volatile long i = 0; i < 100000000; i++);
end = clock();
cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC;
printf("प्रक्रिया समय: %f सेकेन्ड
", cpu_time_used);
printf("प्रक्रिया समय: %f सेकेन्ड
", cpu_time_used);
return 0;
}
यो कोडले निर्दिष्ट लूप प्रक्रियामा लाग्ने चलाउने समय मापन गर्दछ।
डेटा प्रकारहरूको सारांश
तल, समय प्रक्रियामा प्रयोग हुने मुख्य डेटा प्रकारहरूलाई तालिका स्वरूपमा व्यवस्थित गरिएको छ।
डेटा प्रकार | स्पष्टीकरण | मुख्य प्रयोगहरू |
---|---|---|
time_t | सिस्टम समयलाई कायम राख्नु (गुज्रेको सेकेन्डहरू) | वर्तमान समय प्राप्ति |
struct tm | वर्ष, महिना, दिन, घण्टा, मिनेट, सेकेन्ड जस्ता विस्तृत समय जानकारी सुरक्षित राख्नुहोस् | समयको स्वरूप र सञ्चालन |
clock_t | प्रक्रिया को कार्यान्वयन समय कायम राख्नुहोस् | कार्यान्वयन समयको मापन |
3. वर्तमान समय प्राप्त गर्ने तरिका
C gengo मा वर्तमान समय प्राप्त गर्दा, time.h
हेडर फाइलले प्रदान गर्ने time()
फलनलाई प्रयोग गर्नुहोस्। यस खण्डमा, आधारभूत प्रयोगबाट स्थानीय समय र UTC समयमा रूपान्तरणसम्म व्याख्या गरिन्छ।
वर्तमान समय प्राप्त गर्ने आधारभूत
time() फलन
time()
फलनले, वर्तमान प्रणाली समयलाई time_t
प्रकारमा फिर्ता गर्छ। यो फलन अत्यन्त सरल छ, र आर्गुमेन्टमा NULL
निर्दिष्ट गर्नु मात्रले वर्तमान समय प्राप्त गर्न सकिन्छ।
उदाहरण प्रयोग
#include
#include
int main() {
time_t now = time(NULL); // वर्तमान समय प्राप्त गर्नुहोस्
printf("वर्तमान समय (सेकेन्ड): %ld\n", now);
return 0;
}
आउटपुट उदाहरण
वर्तमान समय (सेकेन्ड):1700000000
समयलाई मानवले पढ्न सजिलो ढाँचामा रूपान्तरण गर्ने
स्थानीय समयमा रूपान्तरण: localtime()
localtime()
फलन प्रयोग गर्दा, प्राप्त गरिएको time_t
प्रकारको मानलाई स्थानीय समयमा आधारित struct tm
संरचनामा रूपान्तरण गर्न सकिन्छ।
उदाहरण प्रयोग
#include
#include
int main() {
time_t now = time(NULL); // वर्तमान समय प्राप्त गर्नुहोस्
struct tm *local = localtime(&now); // स्थानीय समयमा रूपान्तरण
printf("वर्तमान स्थानीय समय: %d-%02d-%02d %02d:%02d:%02d\n",
local->tm_year + 1900, // वर्ष १९०० लाई आधार मान्नुहोस्
local->tm_mon + 1, // महिना ० बाट सुरु हुन्छ
local->tm_mday,
local->tm_hour,
local->tm_min,
local->tm_sec);
return 0;
}
आउटपुट उदाहरण
वर्तमान स्थानीय समय: 2025-01-12 15:30:45
UTC समयमा रूपान्तरण: gmtime()
gmtime()
फलनले, time_t
प्रकारको मानलाई समन्वित विश्व समय (UTC) मा आधारित struct tm
संरचनामा रूपान्तरण गर्छ।
उदाहरण प्रयोग
#include
#include
int main() {
time_t now = time(NULL); // वर्तमान समय प्राप्त गर्नुहोस्
struct tm *utc = gmtime(&now); // UTC समयमा रूपान्तरण
printf("वर्तमान UTC समय: %d-%02d-%02d %02d:%02d:%02d\n",
utc->tm_year + 1900,
utc->tm_mon + 1,
utc->tm_mday,
utc->tm_hour,
utc->tm_min,
utc->tm_sec);
return 0;
}
आउटपुट उदाहरण
वर्तमान UTC समय: 2025-01-12 06:30:45
UTC र स्थानीय समयको भिन्नता
- UTC (समन्वित विश्व समय) यो विश्व मानक समय हो र सबै समय क्षेत्रहरूको आधार हो।
- स्थानीय समय यो समय प्रणालीको टाइमजोन सेटिङको आधारमा समायोजित गरिएको समय हो।
उदाहरणका लागि, Nihon Hyōjun Ji(JST)UTC+9 घण्टा हो। त्यसैले, localtime()
र gmtime()
को आउटपुटमा 9 घण्टाको अन्तर हुन्छ।
वर्तमान समयलाई स्ट्रिङ स्वरूपमा देखाउने
ctime() फलन
ctime()
फलनले, time_t
प्रकारको मानलाई सिधै स्ट्रिङ स्वरूपमा देखाउनको लागि सरल फलन हो।
उदाहरण प्रयोग
#include
#include
int main() {
time_t now = time(NULL);
printf("वर्तमान समय: %s", ctime(&now)); // समयलाई स्ट्रिङको रूपमा देखाउनुहोस्
return 0;
}
आउटपुट उदाहरण
वर्तमान समय: Sat Jan 12 15:30:45 2025
ध्यान दिनु पर्ने बुँदा
- आउटपुट अंग्रेजीमा तय गरिएको छ।
- अझ बढी लचिलो ढाँचा आवश्यक परेमा प्रयोग गर्नुहोस् (अर्को खण्डमा व्याख्या गरिएको छ)।
सारांश
- वर्तमान समय प्राप्त गर्नको लागि फङ्सन प्रयोग गर्नुहोस्。
- स्थानीय समयमा 、UTC समयको लागि प्रयोग गरेर परिवर्तन गर्नुहोस्。
- साधारण रूपमा समयलाई स्ट्रिङको रूपमा देखाउन चाहनुहुन्छ भने प्रयोग गर्नुहोस्。
4. समयको ढाँचा: strftime()
को प्रयोग
C gengo मा समयलाई मानिसले सजिलै पढ्न सक्ने ढाँचामा देखाउन चाहनुहुन्छ भने、strftime()
कार्यलाई प्रयोग गर्दा लचिलो ढाँचा निर्दिष्ट गर्न सकिन्छ। यो कार्यले वर्ष-महिना-तारीख र घण्टा-मिनेट-सेकेन्ड मात्र नभई, हप्ता दिन र वर्षभित्रको दिन संख्या (समग्र दिन) जस्ता विस्तृत जानकारी पनि देखाउन सक्छ।
यस खण्डमा、strftime()
कार्यको आधारभूत प्रयोग र उपयोगी ढाँचा उदाहरणहरू प्रस्तुत गरिन्छ।
strftime() कार्य भनेको के हो?
strftime()
कार्यले समय डेटा लाई ढाँचा निर्दिष्ट अनुसार स्ट्रिङमा रूपान्तरण गर्न प्रयोग गरिन्छ।struct tm
संरचनालाई आधार बनाएर, निर्दिष्ट ढाँचामा मिति र समयलाई आउटपुट गर्छ।
कार्य प्रोटोटाइप
size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);
s
max
format
tm
struct tm
फिर्ती मान
परिवर्तित स्ट्रिङको लम्बाइ (बाइट संख्या)। त्रुटि भएमा 0 फिर्ता गर्छ।
आधारभूत प्रयोग
तलको उदाहरणले हालको समयलाई「YYYY-MM-DD HH:MM:SS」को ढाँचामा देखाउँछ।
उदाहरण प्रयोग
#include
#include
int main() {
time_t now = time(NULL); // हालको समय प्राप्त गर्नुहोस्
struct tm *local = localtime(&now); // स्थानीय समयमा रूपान्तरण
char buffer[80]; // ढाँचा पछि स्ट्रिङ राख्ने बफर
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local);
printf("ढाँचा गरिएको मिति समय: %s\n", buffer);
return 0;
}
आउटपुट उदाहरण
ढाँचा गरिएको मिति समय: 2025-01-12 15:30:45
मुख्य ढाँचा निर्दिष्टकर्ता
तलमा प्राय प्रयोग हुने ढाँचा निर्दिष्टकर्ता र तिनको व्याख्या छन्।
निर्देशक | स्पष्टीकरण | आउटपुट उदाहरण |
---|---|---|
%Y | ग्रेगोरियन वर्ष (४ अंक) | 2025 |
%m | माह (01-12) | 01 |
%d | दिन (01-31) | 12 |
%H | घण्टा (00-23) | 15 |
%M | मिनिट (00-59) | 30 |
%S | सेकन्ड (00-60) | 45 |
%A | सप्ताहको दिन (अंग्रेजी) | Saturday |
%a | सप्ताहको दिन (संक्षिप्त रूप) | Sat |
%j | वर्षभित्रको कुल दिन (001-366) | 012 |
%p | AM अथवा PM (लोकेल-निर्भर) | PM |
उदाहरण
- फर्म्याट निर्दिष्ट:
- आउटपुट उदाहरण:
व्यावहारिक उदाहरण: कस्टम ढाँचा
1. Nihongo स्वरूपमा देखाउने
जापानमा प्राय प्रयोग हुने「YYYY年MM月DD日 HH時MM分SS秒」の ढाँचामा देखाउँछ।
उदाहरण प्रयोग
#include
#include
int main() {
time_t now = time(NULL);
struct tm *local = localtime(&now);
char buffer[80];
strftime(buffer, sizeof(buffer), "%Y年%m月%d日 %H時%M分%S秒", local);
printf("हालको मिति समय: %s\n", buffer);
return 0;
}
आउटपुट उदाहरण
हालको मिति समय: 2025年01月12日 15時30分45秒
2. लगको टाइमस्ट्याम्प
सिस्टम लगमा उपयोगी「YYYY-MM-DD_HH-MM-SS」ढाँचा बनाउँछ।
उदाहरण प्रयोग
#include
#include
int main() {
time_t now = time(NULL);
struct tm *local = localtime(&now);
char buffer[80];
strftime(buffer, sizeof(buffer), "%Y-%m-%d_%H-%M-%S", local);
printf("लगको टाइमस्ट्याम्प: %s\n", buffer);
return 0;
}
आउटपुट उदाहरण
लगको टाइमस्ट्याम्प: 2025-01-12_15-30-45
3. अंग्रेजी दिनको नाम समावेश गर्ने ढाँचा
「Sat, 12 Jan 2025」जस्तै ढाँचा बनाउँछ।
उदाहरण प्रयोग
#include
#include
int main() {
time_t now = time(NULL);
struct tm *local = localtime(&now);
char buffer[80];
strftime(buffer, sizeof(buffer), "%a, %d %b %Y", local);
printf("अंग्रेजी ढाँचाको मिति: %s\n", buffer);
return 0;
}
आउटपुट उदाहरण
ढाँचाको मिति: Sat, 12 Jan 2025
4. त्रुटि ह्यान्डलिंग
strftime()
को फिर्ती मान 0 भएमा, बफर साइज सानो छ वा ढाँचा अनुपयुक्त छ। तलका बुँदाहरू जाँच गर्नुहोस्:
- बफर आकार()पर्याप्त छ कि छैन。
- फर्म्याट निर्दिष्टकर्ता सही छ कि छैन?
सारांश
strftime()
कार्य प्रयोग गरेर, समय डेटा लाई स्वतन्त्र रूपमा ढाँचा गर्न सकिन्छ। यसले लग फाइलको टाइमस्ट्याम्प निर्माण वा मानिसले सजिलै पढ्न सक्ने मिति समयको प्रदर्शन सम्भव बनाउँछ।
अर्को खण्डमा, समयको जोड र घटाव बारे व्याख्या गरिनेछ। उदाहरणका लागि, हालको समयमा 1 घण्टा थप्ने वा मिति गणना गर्ने तरिका सिक्नेछौं।
5. समयको जोड‑घट
C Gengo मा, समयलाई सञ्चालन (जोड‑घट) गरेर, भविष्य वा विगतको समयलाई गणना गर्न सकिन्छ। यस खण्डमा, time_t
प्रकार र mktime()
कार्यलाई प्रयोग गरेर समयको सञ्चालन विधि व्याख्या गरिन्छ।
समयको जोड र घट: मूल अवधारणा
time_t
प्रकार प्रणाली समयलाई सेकेन्डको रूपमा दर्शाउने डेटा प्रकार हो। त्यसैले, सेकेन्ड इकाइमा गणना सजिलै गर्न सकिन्छ।
- जोड
- घटाव
समयलाई सञ्चालन गर्ने तरिका
1. time_t
प्रकारले प्रत्यक्ष सञ्चालन
time_t
प्रकारमा सेकेन्ड जोड वा घटाएर सञ्चालन गरिन्छ।
उदाहरण: 1 घण्टापछि समयको गणना
#include
#include
int main() {
time_t now = time(NULL); // वर्तमान समयलाई प्राप्त
time_t future = now + (60 * 60); // 1 घण्टा (60 मिनेट×60 सेकेन्ड) पछि
printf("वर्तमान समय (सेकेन्ड): %ld
", now);
printf("1 घण्टापछि (सेकेन्ड): %ld
", future);
return 0;
}
आउटपुट उदाहरण
वर्तमान समय (सेकेन्ड): 1700000000
1 घण्टापछि (सेकेन्ड): 1700003600
यस विधिमा, साधारण सेकेन्ड इकाइको गणना सम्भव छ।
2. mktime()
कार्यलाई प्रयोग गरेर सञ्चालन
mktime()
कार्य प्रयोग गर्दा, मिति वा समयलाई पार गरेर सञ्चालन गर्न सकिन्छ (उदाहरण: अर्को दिन वा अर्को महिनाको मिति गणना)।
उदाहरण: अर्को दिनको समयको गणना
#include
#include
int main() {
time_t now = time(NULL); // वर्तमान समयलाई प्राप्त
struct tm *local = localtime(&now); // स्थानीय समयमा रूपान्तरण
local->tm_mday += 1; // मितिलाई 1 दिन अगाडि बढाउने
time_t tomorrow = mktime(local); // संशोधित समयलाई time_t मा रूपान्तरण
printf("वर्तमान समय: %s", ctime(&now));
printf("अर्को दिनको समय: %s", ctime(&tomorrow));
return 0;
}
आउटपुट उदाहरण
वर्तमान समय: Sat Jan 12 15:30:45 2025
अर्को दिनको समय: Sun Jan 13 15:30:45 2025
ध्यान
mktime()
समयको अन्तर गणना: difftime()
कार्य
दुईवटा time_t
प्रकारको मानको अन्तर गणना गर्न difftime() कार्य प्रयोग गरिन्छ। यो कार्य अन्तरलाई सेकेन्डमा फर्काउँछ।
उदाहरण: दुई समयको अन्तर गणना
#include
#include
int main() {
time_t now = time(NULL); // वर्तमान समय
time_t future = now + (60 * 60 * 24); // 1 दिन पछि
double diff = difftime(future, now); // समयको अन्तर गणना
printf("वर्तमान समय: %s", ctime(&now));
printf("1 दिनपछि: %s", ctime(&future));
printf("अन्तर: %.0fसेकेन्ड
", diff);
return 0;
}
आउटपुट उदाहरण
वर्तमान समय: Sat Jan 12 15:30:45 2025
1 दिनपछि: Sun Jan 13 15:30:45 2025
अन्तर: 86400सेकेन्ड
समय सञ्चालनको अनुप्रयोग उदाहरण
1. घटनाको तालिका बनाउने
भविष्यको समय गणना गरेर, निश्चित अन्तरालमा घटना उत्पन्न गरिन्छ।
2. विगतको रेकर्ड डेटा विश्लेषण
विगतको समय गणना गरेर, त्यस बिचको डेटा निकालेर विश्लेषण गरिन्छ।
3. समय-आधारित सर्त शाखा
वर्तमान समय र विशेष मानक समय तुलना गरेर, कार्यक्रमको कार्यलाई परिवर्तन गर्न सकिन्छ।
समय सञ्चालन गर्दा ध्यान दिनुपर्ने बुँदा
- समय क्षेत्र स्थानीय समयसँग काम गर्दा, टाइमजोन सेटिङमा ध्यान दिनुहोस्। विश्वव्यापी प्रयोगको लागि UTC प्रयोग गर्ने सिफारिस गरिन्छ।
- जोड्ने र घटाउने एकाइ सेकन्डको एकाइमा गणना आधारभूत हुन्छ, तर ठूलो समयको सञ्चालनमा प्रयोग गर्नु उपयुक्त हुन्छ।
सारांश
time_t
- तारीख र समयलाई पार गर्ने कार्यहरूमा फङ्सनप्रयोग गर्नुहोस्。
- समयको अन्तर गणना गर्न फङ्सन प्रयोग गर्नुहोस्。
अगामी खण्डमा, C Gengo को समय प्रक्रिया संग सम्बन्धित “2038 समस्या” बारे विस्तृत व्याख्या गरिनेछ। यो समस्या बुझेर, भविष्यको प्रणाली विकासको लागि तयार रहनुहोस्।
6. 2038-nen समस्या को तयारी
C Gengo ko samaya prabhandhan ma prayog hune time_t
type le, system ko samaya pradarshan garna ko lagi bishal rup ma prayog garincha. Tara, yo time_t
type sanga sambandhit, “2038-nen Mondai” bhanne thulo samasya cha. Yo section ma, 2038-nen Mondai ko karan, prabhav, ra samadhan bare bishesh rup ma byakhya garincha.
2038-nen समस्या के हो?
2038-nen समस्या C Gengo ra anya dherai system ma prayog hune time_t
type ko karan le samaya ganana ma aune samasya ho.
Samasyako karan
time_t
- 1970 वर्ष 1 महिना 1 दिन 0 घण्टा 0 मिनेट 0 सेकेन्ड (Unix epoch) लाई आधार मान्दै、बितेको सेकेन्डहरू राखिन्छ。
- साइन गरिएको 32‑बिट पूर्णांकमा, प्रतिनिधित्व गर्न सकिने अधिकतम मान 2,147,483,647 हो।
- यो अधिकतम मानमा पुग्ने समय हो, त्यसपछि पूर्णांक ओभरफ्लो हुन्छ र नकारात्मक मानमा परिवर्तन हुन्छ।
Ghatana udaharan
#include
#include
int main() {
time_t max_time = 2147483647; // अधिकतम मान (२०३८-वर्ष समस्या को सीमा)
printf("२०३८-वर्ष समस्या को सीमा समय: %s", ctime(&max_time));
time_t overflow_time = max_time + 1; // सीमालाई पार गर्ने
printf("ओभरफ्लो पछि को समय: %s", ctime(&overflow_time));
return 0;
}
Niskashana udaharan
2038-nen समस्या को सीमा समय: Tue Jan 19 03:14:07 2038
ओभरफ्लो पछि को समय: Fri Dec 13 20:45:52 1901
यो उदाहरणमा, ओभरफ्लोको कारण समय 1901 सालमा फिर्ता सर्छ।
2038-nen समस्या को प्रभाव
2038-nen समस्या धेरै system मा तलका जस्ता प्रभावहरू दिन सक्छ।
- दीर्घकालीन टाइमरहरू र शेड्युलिङ
- 2038 वर्षपछि को मिति र समयलाई ह्यान्डल गर्ने टाइमरहरू र शेड्युलिङले सामान्य रूपमा काम गर्न सक्दैनन्।
- फाइल प्रणाली
- फाइलको टाइमस्ट्याम्प (सिर्जना मिति वा अद्यावधिक मिति) सही रूपमा दर्ता नहुन सक्छ।
- नेटवर्क प्रणाली
- समय प्रयोग गरेर गरिएको प्रमाणीकरण प्रणाली वा लग रेकर्डिङमा असामान्य घटना हुन सक्छ।
- एम्बेडेड प्रणाली
- पुराना उपकरणहरू र इन्फ्रास्ट्रक्चर उपकरणहरू (उदाहरण: ATM र POS टर्मिनलहरू) मा, 2038 वर्षको समस्या समाधान गर्न कठिन हुन सक्छ।
2038-nen समस्या को समाधान
2038-nen समस्या टाल्नको लागि तलका जस्ता उपायहरू छन्।
1. 64-bit वातावरणमा स्थानान्तरण
time_t
- 64-बिटको मा, लगभग 2920 अर्ब वर्षको समयलाई व्यक्त गर्न सकिन्छ।
Prayog udaharan
64-bit वातावरणमा विशेष रूपमा सोच्न नपर्दा समस्या समाधान भएको केसहरू धेरै छन्।
2. समय प्रक्रिया को लाइब्रेरीको उपयोग
- मानक पुस्तकालयको अतिरिक्त, अझ लचिलो समय प्रशोधन उपलब्ध गराउने बाह्य पुस्तकालयहरू (उदाहरण: र ) प्रयोग गरेर समाधान गर्न सकिन्छ।
3. समयको वैकल्पिक अभिव्यक्ति
- स्ट्रिङ्ग वा अनुकूल डेटा टाइप प्रयोग गरेर समय राख्ने तरिका पनि छ। तर, यो तरिकाले काम गर्न गाह्रो हुन्छ र सम्पूर्ण प्रणालीको डिजाइन परिवर्तन गर्नुपर्ने हुन सक्छ।
व्यावहारिक कार्यमा उत्तरदायित्वका उदाहरण
सर्भरको जाँच र अद्यावधिक
- यदि तपाईं पुरानो 32‑बिट प्रणाली प्रयोग गर्दै हुनुहुन्छ भने, सम्भव भएमा 64‑बिट संस्करणको अपरेटिङ सिस्टम वा लाइब्रेरीमा अपग्रेड गर्नुहोस्।
अवस्थित कोडको पुनरावलोकन
time_t
नयाँ विकासको सावधानी
- नयाँ विकासमा, 64‑बिट वातावरणमा सञ्चालनको आधारमा डिजाइन गर्ने सल्लाह दिइन्छ।
2038-nen समस्या को वर्तमान स्थिति
हालैका वर्षहरूमा, धेरै system हरू 64-bit वातावरणमा स्थानान्तरण गरिरहेका छन्, त्यसैले नयाँ विकासमा 2038-nen समस्या प्रति सचेत रहनु आवश्यक कम भएको छ। तर, विशेष गरी पुराना एम्बेडेड system र अद्यावधिक गर्न कठिन इन्फ्रास्ट्रक्चरमा, यो समस्या बाँकी रहन सक्छ।
सारांश
- 2038 वर्षको समस्या भनेको प्रकार 32 बिटमा कार्यान्वयन गरिएको अवस्थामा समय गणना सम्बन्धी समस्या हो।
- समाधानको रूपमा, 64-बिट वातावरणमा स्थानान्तरण र उपयुक्त पुस्तकालयहरूको प्रयोग सिफारिस गरिन्छ।
- पुरानो प्रणाली प्रयोग गरिरहनु भएको अवस्थामा, शीघ्रै समाधानहरू विचार गर्नु महत्त्वपूर्ण छ।
अर्को भागमा, C Gengo मा समय प्रक्रिया प्रयोग गरेर व्यावहारिक प्रयोग केसहरू प्रस्तुत गरिनेछ। उदाहरणका लागि, टाइमस्ट्याम्प प्रयोग गरेर लग रेकर्डिङ वा इभेन्ट शेड्युलिङ जस्ता वास्तविक परिस्थितिहरूमा प्रयोग गर्ने तरिका व्याख्या गरिनेछ।
7. व्यावहारिक उपयोग केसहरू
C भाषा को समय प्रक्रिया केवल सरल वर्तमान समय प्राप्ति मात्र होइन, विभिन्न व्यावहारिक प्रणालीहरूमा पनि प्रयोग गरिन्छ। यस खण्डमा, समय प्रक्रियालाई प्रयोग गरेर केही विशिष्ट उपयोग केसहरू प्रस्तुत गरिन्छ। यी उदाहरणहरूलाई सन्दर्भ गरेर, तपाईंले आफ्नो प्रोग्राममा समय प्रक्रिया समावेश गर्ने विचार पाउन सक्नुहुनेछ।
1. लग रेकर्डमा टाइमस्ट्याम्प थप्नुहोस्
सिस्टम लग र त्रुटि लगमा सामान्यतया कार्यसमयको टाइमस्ट्याम्प रेकर्ड हुन्छ। यो टाइमस्ट्याम्प थपेर, पछि समस्याको कारण पत्ता लगाउन सजिलो हुन्छ।
उदाहरण प्रयोग: लगमा टाइमस्ट्याम्प रेकर्ड गर्नु
#include
#include
void log_message(const char *message) {
time_t now = time(NULL);
struct tm *local = localtime(&now);
char timestamp[80];
strftime(timestamp, sizeof(timestamp), "%Y-%m-%d %H:%M:%S", local);
printf("[%s] %s\n", timestamp, message);
}
int main() {
log_message("प्रोग्राम सुरु भयो");
log_message("त्रुटि उत्पन्न भयो");
log_message("प्रोग्राम समाप्त भयो");
return 0;
}
आउटपुट उदाहरण
[2025-01-12 15:30:45] प्रोग्राम सुरु भयो
[2025-01-12 15:30:46] त्रुटि उत्पन्न भयो
[2025-01-12 15:30:47] प्रोग्राम समाप्त भयो
2. इभेन्टको तालिका बनाउने
निर्दिष्ट अन्तरालमा प्रक्रिया चलाउने टाइमर कार्यक्षमता कार्यान्वयन गर्नु खेल र रियल‑टाइम प्रणालीहरूमा प्रायः प्रयोग हुन्छ।
उदाहरण प्रयोग: टाइमर कार्यान्वयन
तल 5 सेकेन्डमा एक पटक इभेन्ट चलाउने प्रोग्रामको उदाहरण हो।
#include
#include
#include // UNIX वातावरणको लागि स्लीप फङ्क्शन
void perform_task() {
printf("इभेन्ट चलाइयो\n");
}
int main() {
time_t start = time(NULL);
while (1) {
time_t now = time(NULL);
if (difftime(now, start) >= 5) { // ५ सेकेन्ड बितेपछि कार्य चलाउनु
perform_task();
start = now; // सुरु समय अद्यावधिक गर्नु
}
sleep(1); // CPU लोड घटाउन १ सेकेन्ड स्लीप
}
return 0;
}
आउटपुट उदाहरण
इभेन्ट चलाइयो
(५ सेकेन्ड पछि)
इभेन्ट चलाइयो
(अझै ५ सेकेन्ड पछि)
इभेन्ट चलाइयो
3. मिति सञ्चालन र म्याद व्यवस्थापन
मिति गणना गरेर, विशिष्ट म्याद (जस्तै: भुक्तानी मिति वा कार्यको डेडलाइन) व्यवस्थापन गर्नु पनि महत्त्वपूर्ण छ।
उदाहरण प्रयोग: भुक्तानी मितिको गणना
तलको उदाहरणले वर्तमान मितिबाट 30 दिन पछि भुक्तानी मिति गणना गरी देखाउँछ।
#include
#include
int main() {
time_t now = time(NULL);
struct tm *due_date = localtime(&now);
due_date->tm_mday += 30; // 30 दिन पछि
mktime(due_date); // मिति सामान्यीकरण
char buffer[80];
strftime(buffer, sizeof(buffer), "%Y-%m-%d", due_date);
printf("भुक्तानी मिति: %s\n", buffer);
return 0;
}
आउटपुट उदाहरण
भुक्तानी मिति: 2025-02-11
4. प्रोग्रामको कार्यसमय मापन
प्रोग्रामको प्रदर्शन अनुकूलन गर्दा, कार्यसमय मापन गर्नु महत्त्वपूर्ण हुन्छ।
उदाहरण प्रयोग: प्रक्रिया समयको मापन
#include
#include
int main() {
clock_t start = clock();
// मापन लक्ष्य प्रक्रिया (उदाहरण: लूप प्रक्रिया)
for (volatile long i = 0; i < 100000000; i++);
clock_t end = clock();
double elapsed = (double)(end - start) / CLOCKS_PER_SEC;
printf("प्रक्रिया समय: %.3f सेकेन्ड\n", elapsed);
return 0;
}
आउटपुट उदाहरण
प्रक्रिया समय: 0.215 सेकेन्ड
5. समय‑आधारित सर्त शाखा
प्रोग्रामको व्यवहारलाई कार्यसमय अनुसार परिवर्तन गर्न सकिन्छ। उदाहरणका लागि, बिहान र दिउँसोमा फरक सन्देश देखाउने प्रोग्राम बनाउन सकिन्छ।
उदाहरण प्रयोग: बिहान‑दिउँसो सन्देश परिवर्तन
#include
#include
int main() {
time_t now = time(NULL);
struct tm *local = localtime(&now);
if (local->tm_hour < 12) {
printf("शुभप्रभात!\n");
} else {
printf("नमस्ते!\n");
}
return 0;
}
आउटपुट उदाहरण(बिहानको अवस्थामा)
शुभप्रभात!
आउटपुट उदाहरण(दिउँसोको अवस्थामा)
नमस्ते!
सारांश
C भाषा को समय प्रक्रिया लग रेकर्ड, तालिका बनाउने, मिति गणना, कार्यसमय मापन आदि विभिन्न प्रणालीहरूमा उपयोगी छ। यस खण्डमा प्रस्तुत उपयोग केसहरू दैनिक प्रोग्राम निर्माणमा सहयोगी हुनेछन्।
अर्को खण्डमा, “बारम्बार सोधिने प्रश्न (FAQ)” लाई समेट्नेछौं। समय प्रक्रियासँग सम्बन्धित पाठकहरूले अक्सर उठाउने प्रश्नहरू समाधान गर्नेछौं।
8. अक्सर सोधिने प्रश्न (FAQ)
C Gengo मा समय प्रक्रिया गर्दा, शुरुआतीदेखि मध्यवर्ती स्तरका धेरै व्यक्तिहरूले प्रश्न उठाउँछन्। यस खण्डमा, अक्सर सोधिने प्रश्नहरूको उत्तर दिँदै, समय प्रक्रियाबारेको बुझाइलाई गहिरो बनाउनेछौं।
Q1. वर्तमान समयलाई जापान समय (JST) मा कसरी प्राप्त गर्ने?
A. जापान समय (JST) UTC भन्दा 9 घण्टा अगाडि छ।localtime()
कार्यले प्रणालीको स्थानीय समयक्षेत्रलाई विचार गरेर रूपान्तरण गर्छ, त्यसैले प्रणालीको समयक्षेत्र JST मा सेट गरिएको भए स्वचालित रूपमा जापान समय प्राप्त गर्न सकिन्छ।
उदाहरण प्रयोग
#include
#include
int main() {
time_t now = time(NULL);
struct tm *local = localtime(&now);
printf("वर्तमान जापान समय: %d-%02d-%02d %02d:%02d:%02d\n",
local->tm_year + 1900, local->tm_mon + 1, local->tm_mday,
local->tm_hour, local->tm_min, local->tm_sec);
return 0;
}
टिप्पणी: प्रणालीको समयक्षेत्र सही रूपमा सेट गरिएको छ कि छैन जाँच गर्नुहोस्।
Q2. समयलाई मिलिसेकेन्ड इकाइमा प्राप्त गर्न सकिन्छ?
A. मानक time.h
मा मिलिसेकेन्ड इकाइको प्राप्ति समर्थन छैन। तर, प्लेटफर्म-निर्भर API (उदाहरण: UNIX वातावरणमा gettimeofday()
कार्य) प्रयोग गर्दा मिलिसेकेन्ड सटीकतामा प्राप्ति सम्भव छ।
उदाहरण: UNIX वातावरणमा मिलिसेकेन्ड प्राप्ति
#include
#include
int main() {
struct timeval tv;
gettimeofday(&tv, NULL);
printf("वर्तमान समय: %ld सेकेन्ड र %ld मिलिसेकेन्ड\n", tv.tv_sec, tv.tv_usec / 1000);
return 0;
}
आउटपुट उदाहरण
वर्तमान समय: 1700000000 सेकेन्ड र 123 मिलिसेकेन्ड
Q3. डेलाइट सेविंग टाइम (DST) लाई कसरी समर्थन गर्ने?
A. डेलाइट सेविंग टाइम (DST) लाई struct tm
संरचनाको tm_isdst
सदस्यद्वारा पहिचान गर्न सकिन्छ।
1
0
-1
उदाहरण प्रयोग
#include
#include
int main() {
time_t now = time(NULL);
struct tm *local = localtime(&now);
if (local->tm_isdst > 0) {
printf("वर्तमानमा डेलाइट सेविंग टाइम हो\n");
} else {
printf("वर्तमानमा डेलाइट सेविंग टाइम होइन\n");
}
return 0;
}
Q4. strftime()
द्वारा जापानी भाषा को हप्ता दिन देखाउन सकिन्छ?
A. मानक strftime()
ले लोकेल (भाषा र क्षेत्रीय सेटिङ) लाई विचार गर्छ। setlocale()
कार्य प्रयोग गरेर लोकेललाई जापानीमा सेट गर्दा, जापानी हप्ता दिन देखाउन सकिन्छ।
उदाहरण प्रयोग
#include
#include
#include
int main() {
setlocale(LC_TIME, "ja_JP.UTF-8");
time_t now = time(NULL);
struct tm *local = localtime(&now);
char buffer[80];
strftime(buffer, sizeof(buffer), "%Y年%m月%d日 %A", local);
printf("वर्तमान मिति समय: %s\n", buffer);
return 0;
}
आउटपुट उदाहरण
वर्तमान मिति समय: 2025年01月12日 रविवार
ध्यान: लोकेल सेटिङ प्रणालीमा निर्भर हुन्छ, त्यसैले जापानी लोकेल सेट नभएको वातावरणमा काम नहुन सक्छ।
Q5. 2038 वर्षपछि समयलाई सही रूपमा कसरी ह्यान्डल गर्ने?
A. 2038 समस्या टाल्नको लागि, 64-बिटको time_t
प्रयोग गर्नुहोस् वा अन्य डेटा प्रकारमा समय राख्ने तरिका अपनाउनुहोस्। अधिकांश 64-बिट वातावरणमा time_t
64-बिटमा विस्तार गरिएको छ, त्यसैले विशेष रूपमा नसोचिकन 2038 पछि पनि प्रयोग गर्न सकिन्छ।
उदाहरण: 64-बिट time_t
वातावरणमा जाँच
#include
#include
int main() {
time_t future = 2147483648; // 2038 समस्या पार गर्ने मान
printf("समय: %s", ctime(&future));
return 0;
}
आउटपुट उदाहरण
समय: Tue Jan 19 03:14:08 2038
ध्यान: 32-बिट वातावरणमा सही रूपमा काम नहुन सक्छ।
Q6. कार्यक्रमले अपेक्षित समय नदेखाएमा कारण के हो?
A. मुख्य कारणहरू तलका अनुसार हुन सक्छन्:
- टाइमजोन सेटिङ त्रुटि
struct tm
को अमान्य मानmktime()
- पुरानो मानक पुस्तकालय
सारांश
यस FAQ खण्डमा, C Gengo मा समय प्रक्रिया गर्दा अक्सर उठ्ने प्रश्नहरू र तिनका समाधानहरू व्याख्या गरियो। वास्तविक रूपमा कोड चलाएर हेर्दा, समय प्रक्रियाबारेको बुझाइ गहिरो हुनेछ।
अर्को खण्डमा, सम्पूर्ण लेखको सारांश गरिनेछ, र सिकेको सामग्रीलाई छोटकरीमा पुनरावलोकन गरिनेछ।
अर्को खण्डमा, सम्पूर्ण लेखको सारांश गरिनेछ, र सिकेको सामग्रीलाई छोटकरीमा पुनरावलोकन गरिनेछ।
9. सारांश
यस लेखमा, C भाषा मा समय प्रक्रिया बारे, आधारभूतदेखि अनुप्रयोगसम्म विस्तृत रूपमा व्याख्या गरिएको छ। समय प्रक्रिया कार्यक्रममा एक महत्वपूर्ण कार्य हो, र यसलाई सही रूपमा बुझेर धेरै परिस्थितिहरूमा प्रयोग गर्न सकिन्छ।
लेखको पुनरावलोकन
तल, यस लेखमा सिकेका मुख्य बुँदाहरूलाई संक्षेपमा प्रस्तुत गर्दछौं।
- C भाषाको समय प्रशोधनको मूलभूत
time.h
- मुख्य डेटा प्रकार(、)र कार्यहरू(、、 आदि)को व्याख्या गरियो।
- हालको समय प्राप्ति र प्रदर्शन
time()
localtime()
gmtime()
ctime()
strftime()
- समयको सञ्चालन र गणना
time_t
- तारीखहरू पार गर्ने जटिल कार्यहरूका लागि फङ्सन प्रयोग गरेर समयलाई सामान्यीकरण गर्ने तरिका सिकें।
difftime()
- 2038 वर्षको समस्या बुझ्ने र समाधान
time_t
- समाधानको रूपमा, 64‑बिट वातावरणमा स्थानान्तरण गर्ने र उपयुक्त पुस्तकालयहरूको प्रयोग गर्ने सल्लाह दिइयो।
- व्यावहारिक प्रयोग केसहरू
- हामीले टाइमस्ट्याम्प प्रयोग गरेर लग रेकर्ड गर्ने र विशिष्ट अन्तरालमा प्रक्रिया चलाउने शेड्युलिङको कार्यान्वयन उदाहरणहरू परिचय गर्यौं।
- अमल समयको मापन र मिति गणना समावेश गरेर विशिष्ट अनुप्रयोग उदाहरणहरू पनि सिक्यौं।
- FAQ मार्फत शंकाहरू समाधान गर्नुहोस्
- जापान समय प्राप्ति, मिलिसेकेन्ड गणना, ग्रीष्मकालीन समय अनुकूलन आदि, समय प्रक्रियासम्बन्धी सामान्य प्रश्नहरू र तिनीहरूको समाधानहरू व्याख्या गरियो।
व्यवहारमा एक कदम
C भाषाको समय प्रक्रिया, लग प्रणाली, टाइमर कार्य, शेड्युलिङ आदि जस्ता विभिन्न प्रयोजनहरूमा प्रयोग हुन्छ। यस लेखमा प्रस्तुत कोड उदाहरणलाई सन्दर्भ गरी, आफ्नो प्रोजेक्टमा समय प्रक्रियालाई प्रयोग गरेर हेर्नुहोस्।
अर्को चरण
यदि तपाईं अझ गहिरो सिक्न चाहनुहुन्छ भने, तलका विषयहरू पनि सिफारिस गरिन्छ।
- मल्टिथ्रेड वातावरणमा समय प्रशोधन थ्रेड-सेफ समय सञ्चालन सिकेर, समानान्तर प्रोग्रामिङमा समय प्रशोधन सम्भव हुन्छ।
- बाह्य लाइब्रेरीको उपयोग Boost र Chrono जस्ता लाइब्रेरीहरू प्रयोग गर्दा, अझ लचिलो र शक्तिशाली समय सञ्चालन सम्भव हुन्छ।
- सिस्टमको समग्र टाइमजोन व्यवस्थापन ग्लोबल सिस्टम डिजाइन गर्दा, टाइमजोन व्यवस्थापन महत्वपूर्ण हुन्छ।
अन्तमा
समय सबै कार्यक्रमहरूमा एक महत्वपूर्ण तत्व हो। यो लेखले C भाषामा समय प्रक्रियाको बुझाइलाई गहिरो बनाउने र अधिक प्रभावकारी कार्यक्रम निर्माण गर्न सहयोग पुर्याउँछ भन्ने आशा छ।