2012-09-10 22 views
8

मैं सी ++ में अपॉइंटमेंट एप्लिकेशन विकसित कर रहा हूं और कुछ दिनांक और समय सुविधाओं का उपयोग करना चाहता हूं।सी ++ दिनांक और समय

क्या तारीख और समय के बारे में बात करते समय केवल स्ट्रिंग का उपयोग करना आसान है, या मुझे डेट/टाइम क्लास लिखना चाहिए या नहीं?

मैं एक अपॉइंटमेंट क्लास को कोड करना चाहता हूं जिसमें नियुक्ति के समय और तिथि दोनों हों। एक बार जब मैंने कक्षा फ़ाइल को कोड किया है, तो मैं इसे सी ++ बिल्डर में फॉर्म फॉर्म में एकीकृत करना चाहता हूं।

मुझे लगता है कि एक TMonthCalendar नियंत्रण है। प्रपत्र आवेदन करते समय मैं इस नियंत्रण का उपयोग करना चाहता हूं। इस प्रकार, इस नियंत्रण का उपयोग किस तारीख के लिए किया जाता है? कक्षा बनाने के दौरान मैं उसी प्रकार के नियंत्रण के रूप में उपयोग करना चाहता हूं ताकि मैं इसे आसानी से एक साथ एकीकृत कर सकूं।

अद्यतन

मैंने पाया कि यह TDateTime प्रकार का उपयोग करता है। मेरा सवाल यह है: कंसोल एप्लिकेशन में इसका उपयोग करने के लिए मुझे किस कथन का उपयोग करने की ज़रूरत है?

+4

मुझे कुछ दिनांक समय पुस्तकालय प्राप्त करने का सुझाव है। [Boost.datetime] देखें (http://www.boost.org/doc/libs/1_51_0/doc/html/date_time.html)। – juanchopanza

+0

बूस्ट लाइब्रेरी के साथ जाएं, या ओएस "डेट" फ़ंक्शंस के लिए एक साधारण क्लास रैपर लिखें। यदि आप किसी डेटाबेस में सहेज रहे हैं, तो अन्यथा "डेटटाइम" का उपयोग करना, अन्यथा स्ट्रिंग का उपयोग करना (शायद एक JSON स्ट्रिंग, शायद एक एक्सएमएल स्ट्रिंग, या शायद सिर्फ एक फ्लैट फ़ाइल) आपकी तिथियों को पढ़ने और लिखने के लिए ठीक है। – paulsm4

उत्तर

14

सी ++ 11 में सुविधाजनक डेटा प्रकार और दिनांक/समय के प्रतिनिधित्व के लिए फ़ंक्शन, साथ ही तारों में उनके रूपांतरण शामिल हैं।

इसी के साथ

, तो आप इस तरह बातें कर सकते हैं (सुंदर आत्म व्याख्यात्मक, मुझे लगता है):

#include <iostream> 
#include <iomanip> 
#include <ctime> 

int main() 
{ 
    std::time_t t = std::time(NULL); 
    std::tm tm = *std::localtime(&t); 
    std::cout << "Time right now is " << std::put_time(&tm, "%c %Z") << '\n'; 
} 

विशेष रूप से, डेटा प्रकार std::time_t और std::tm, और सुंदर के लिए एक बहुत अच्छा आईओ जोड़तोड़ std::put_time हैं मुद्रण। इसके द्वारा प्रयुक्त प्रारूप स्ट्रिंग cppreference पर अच्छी तरह से प्रलेखित हैं।

यह भी स्थानीय लोगों के साथ मिलकर काम करना चाहिए, उदाहरण के लिए एक जापानी समय/दिनांक स्वरूप के लिए: दुर्भाग्य से

std::chrono::time_point<std::chrono::system_clock> now; 
now = std::chrono::system_clock::now(); 
/* The day before today: */ 
std::time_t now_c = std::chrono::system_clock::to_time_t(
     now - std::chrono::hours(24)); 

, नहीं:

std::cout.imbue(std::locale("ja_JP.utf8")); 
std::cout << "ja_JP: " << std::put_time(&tm, "%c %Z") << '\n'; 

chrono पुस्तकालय सी ++ 11 मानक लाइब्रेरी में शामिल भी आप सरल समय/तिथि अंकगणित आसानी से करने की अनुमति देता यह सब अभी तक सभी कंपाइलरों में उपलब्ध है। विशेष रूप से, std::put_time फ़ंक्शन अभी तक जीसीसी 4.7.1 में उपलब्ध नहीं प्रतीत होता है।

#include <iostream> 
#include <iomanip> 
#include <ctime> 

int main() 
{ 
    std::time_t t = std::time(NULL); 
    std::tm tm = *std::localtime(&t); 

    constexpr int bufsize = 100; 
    char buf[bufsize]; 
    if (std::strftime(buf,bufsize,"%c %Z",&tm) != 0) 
     std::cout << "Time right now is " << buf << std::endl; 
} 
1

यह सिर्फ तार का उपयोग करना आसान जब दिनांक और समय के बारे में बात है: कोड मैं शुरू में दे दी है काम करने के लिए, मैं थोड़ा कम सुरुचिपूर्ण std::strftime समारोह का इस्तेमाल किया था प्राप्त करने के लिए?

नहीं। यदि आपके पास मीटिंग प्रारंभ और समाप्ति तिथि है तो अवधि की गणना करने जैसी सरल चीजें भी लीप वर्षों जैसी जटिल चीजों के लिए खाते हैं।

क्या मुझे लिखना चाहिए या तिथि/समय कक्षा मिलनी चाहिए?

नंबर एक दिनांक/समय लाइब्रेरी लेखन सरल लगता है, लेकिन यह सही और बेहद गलत प्राप्त करना आसान पाने के लिए नहीं बल्कि मुश्किल है। इसके अलावा, दूसरों ने इसे पहले किया है - boost is a collection of free libraries with stellar reputation।वास्तव में बहुत से अन्य, यह एक cliche बन गया है कि नौसिखिया प्रोग्रामर दिनांक/समय पुस्तकालय, failinghorriblyatit लिखना चाहते हैं।

मुझे लगता है कि एक TMonthCalendar नियंत्रण है। [...] मैंने पाया है कि यह TDateTime प्रकार का उपयोग करता है।

आपके जीयूआई ढांचे के समान दिनांक/समय वर्ग पर निर्भर होना ठीक है, लेकिन यदि आप बाद में जीयूआई ढांचे को बदलते हैं तो यह एक मुद्दा बन सकता है। चूंकि बाद में किसी अन्य समझदार दिनांक/समय लाइब्रेरी के लिए एक समझदार तिथि/समय लाइब्रेरी को स्वैप करना बहुत कठिन नहीं है, इसलिए केवल उस का उपयोग करें जिसे आप उपयोग करना आसान पाते हैं।

संबंधित मुद्दे