เนื่องจากตอนนี้กลับมาเขียน C++ เป็นหลัก จึงอยากเขียนหลายๆ อย่างให้อยู่ในรูปของอ็อบเจกต์ด้วย จึงหาไลบรารีมาใช้งาน ที่สนใจตอนนี้คือไลบรารีเรื่องของวันและเวลาจากชุดไลบรารีของ boost ซึ่งชุดไลบรารีของ boost เองหลายชุดได้กลายเป็นแม่แบบมารตฐาน C++11 ด้วย สำหรับตอนนี้สนใจเรื่องเกี่ยบกับเวลา เราอาจจะเลือกใช้ ctime ได้แต่อาจจะอยู่ในรูปปของฟังก์ชันและพอยน์เตอร์ หรือ tm struct แต่การใช้ tm struct เราอาจจะต้องมาจัดการเรืองของช่วงเวลาเอง อาจจะยุ่งยากเล็กน้อย ลองมาดูไลบรารี date_time ของ boost กันดีกว่า
$ ./a.out
time t1: 2011-Sep-20 12:44:20.668140
time t2: 2011-Sep-20 12:44:21.668405
current time:: 12:44:21.668405
current sec time:: 21
current min time:: 44
current hours time:: 12
diff time: 00:00:01.000265
diff time in sec: 1
ตัวอ็อบเจกต์ของ ptime เองอาจจะทำอะไรไม่ได้มากเนื่องจากมีคุณสมบัติ immutable และมีพื้นฐานอยู่บน gregorian::date อีกทีนึง การใช้งานข้อมูลต่างๆ สามารถทำได้จากอ็อบเจกต์ของ time_duration แทนผ่านทาง time_of_day() เราสามารถเข้าถึงค่าเวลาต่างๆ ได้จากอ็อบเจกต์นี้ นอกจากนี้ ptime ยังสามารถแปลงเป็น struct tm ได้อีกด้วยผ่านทาง tm to_tm(ptime); จากตัวอย่างที่ได้แสดงไว้นี้เป็นการเอาอ็อบเจกต์ของ time_duration มาลบกันเพื่อหาว่าเวลาปัจจุบันต่างจากเวลาเริ่มต้นไปเท่าไหร่แล้ว เราสามารถนำมาลบกันได้อย่างง่ายดายไม่จำเป็นต้องแปลงจากชั่วโมงหรือนาทีให้อยู่ในรูปของวินาทีเองแล้วค่อยลบกัน :D
// date_time.cppนี่เป็นตัวอย่างการใช้ ptime หรือ posix time นั้นเอง เราสามารถสร้างอ็อบเจกต์ของ ptime ได้หลายวิธี แต่ในตัวอย่างใช้วิธีการใช้นาฬิการะบบ หากต้องการเก็บเวลาในระดับ microsec ก็สามารถสร้างได้ดังตัวอย่างคือ boost::posix_time::microsec_clock::local_time(); นอกจากนี้เราสามารถใช้ในหน่วยวินาทีได้เช่นกันโดยใช้ boost::posix_time::second_clock ตามต้องการ ทดลองคอมไพล์และรันดู $ g++ -lboost_date_time date_time.cpp
#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace::std;
int main(){
boost::posix_time::ptime t1 = boost::posix_time::microsec_clock::local_time();
cout<<"time t1: " << boost::posix_time::to_simple_string(t1) <<endl;
sleep(1);
boost::posix_time::ptime t2 = boost::posix_time::microsec_clock::local_time();
cout<<"time t2: " << boost::posix_time::to_simple_string(t2) <<endl;
boost::posix_time::time_duration td = t2-t1;
cout<<endl<<"current time:: "<<t2.time_of_day()<<endl;
cout<<"current sec time:: "<<t2.time_of_day().seconds()<<endl;
cout<<"current min time:: "<<t2.time_of_day().minutes()<<endl;
cout<<"current hours time:: "<<t2.time_of_day().hours()<<endl;
cout<<"diff time: "<<td<<endl;
cout<<"diff time in sec: "<<td.seconds()<<endl;
return 0;
}
$ ./a.out
time t1: 2011-Sep-20 12:44:20.668140
time t2: 2011-Sep-20 12:44:21.668405
current time:: 12:44:21.668405
current sec time:: 21
current min time:: 44
current hours time:: 12
diff time: 00:00:01.000265
diff time in sec: 1
ตัวอ็อบเจกต์ของ ptime เองอาจจะทำอะไรไม่ได้มากเนื่องจากมีคุณสมบัติ immutable และมีพื้นฐานอยู่บน gregorian::date อีกทีนึง การใช้งานข้อมูลต่างๆ สามารถทำได้จากอ็อบเจกต์ของ time_duration แทนผ่านทาง time_of_day() เราสามารถเข้าถึงค่าเวลาต่างๆ ได้จากอ็อบเจกต์นี้ นอกจากนี้ ptime ยังสามารถแปลงเป็น struct tm ได้อีกด้วยผ่านทาง tm to_tm(ptime); จากตัวอย่างที่ได้แสดงไว้นี้เป็นการเอาอ็อบเจกต์ของ time_duration มาลบกันเพื่อหาว่าเวลาปัจจุบันต่างจากเวลาเริ่มต้นไปเท่าไหร่แล้ว เราสามารถนำมาลบกันได้อย่างง่ายดายไม่จำเป็นต้องแปลงจากชั่วโมงหรือนาทีให้อยู่ในรูปของวินาทีเองแล้วค่อยลบกัน :D
ความคิดเห็น
แสดงความคิดเห็น