您的位置:首页 > 编程语言

Windows下日期时间编程简单总结

2010-04-04 14:58 393 查看
在日常编程中,对日期和时间的处理是非常频繁的,我们可以使用C运行库提供的时间计算函数来支持开发,Windows下还提供了诸如MFC的CTime等操作对象,但是在跨平台开发的情况下,CTime就不适用了。所以这里总结了一下C运行库的一些常用函数,以便参考.
 
1.类型 time_t中存储的是自1970年1月1日午时到现在的偏移量,以秒计时,因此Windows系统下多用此做时间计算。
类型time_t实际上是个整数,看time_t 的定义:
ifndef _TIME_T_DEFINED
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;      /* time value */
#else
typedef __time64_t time_t;      /* time value */
#endif
#define _TIME_T_DEFINED         /* avoid multiple def's of time_t */
#endif
 
关于__time64_t的定义如下:
#ifndef _TIME32_T_DEFINED
typedef _W64 long __time32_t;   /* 32-bit time value */
#define _TIME32_T_DEFINED
#endif
 
#ifndef _TIME64_T_DEFINED
typedef __int64 __time64_t;     /* 64-bit time value */
#define _TIME64_T_DEFINED
#endif
 
2. 函数gmtime和localtime
函数localtime, 会把传入的time_t时间转化为 tm类型的数据,并初始化为本地时间
struct tm * localTime(const time_t * timer);
而gmtime会得到标准时间(格林尼治时间).
struct tm *gmtime(const time_t * timer);
 
tm结构
struct tm {
        int tm_sec;     /* seconds after the minute - [0,59] */
        int tm_min;     /* minutes after the hour - [0,59] */
        int tm_hour;    /* hours since midnight - [0,23] */
        int tm_mday;    /* day of the month - [1,31] */
        int tm_mon;     /* months since January - [0,11] */
        int tm_year;    /* years since 1900 */
        int tm_wday;    /* days since Sunday - [0,6] */
        int tm_yday;    /* days since January 1 - [0,365] */
        int tm_isdst;   /* daylight savings time flag */
        };
 
3. tm 结构转换为time_t的函数
time_t mktime(struct tm * timeptr);
根据MSDN的解释,mktime会忽略tm_wday, tm_yday数据域.
 
4. 得到系统时间函数 time
time_t time(time_t * timer);
The time function returns the number of seconds elapsed since midnight (00:00:00), January 1, 1970, Coordinated Universal Time (UTC), according to the system clock. The return value is stored in the location given by timer. This parameter may be NULL, in which case the return value is not stored.
 
5. 时区信息,可以通过下面的全局变量得到时区偏移,也可以通过当地时间和UTC时间的比较,得到时区偏移.
extern long _timezone; 
extern char *_tzname[2];
 
6. 我的时间函数封装:
头文件:
///////////////////////////////////////////////////////////////////////////////
// 文件: SimpleDateTime.h
// 日期: 2010/04/04
// 作者:
// 说明:
//       简单的时间封装.
///////////////////////////////////////////////////////////////////////////////
#pragma once
 
#include <iostream>
#include <time.h>
 
namespace DateTime
{
class SimpleDateTime
{
public:
     SimpleDateTime(void);
     // 用time_t 初始化
     SimpleDateTime(time_t time);
     // 用当地时间初始化
     SimpleDateTime(int year, int month, int day);
     // 用当地时间初始化
     SimpleDateTime(int year, int month, int day,
         int hour, int minute, int second);
     // 用指定时区时间初始化
     SimpleDateTime(int year, int month, int day, int timeZone);
     // 用指定时区时间初始化
     SimpleDateTime(int year, int month, int day,
         int hour, int minute, int second, int timeZone);
     SimpleDateTime(const SimpleDateTime & right);
     ~SimpleDateTime(void);
 
public:
     SimpleDateTime & operator=(const SimpleDateTime & right);
 
     bool operator==(const SimpleDateTime & right) const;
     bool operator!=(const SimpleDateTime & right) const;
 
public:
     // 当前时间
     void currentTime(void);
     // 转化为本地时间.
     SimpleDateTime toLocalTime();
     // 返回time_t
     time_t toTime_t() const;
 
public:
     int getYear() const;
     int getMonth() const;
     int getDay() const;
     int getHour() const;
     int getMinute() const;
     int getSecond() const;
     int getWeek() const;
     int getIsdst() const;
     int getTimeZone() const;
 
private:
     void formatTime();
     void calcTimeZone();
 
private:
     time_t time_;
     struct tm tm_time_;
     int timeZone_;
 
};
}
 
实现文件:
///////////////////////////////////////////////////////////////////////////////
// 文件: SimpleDateTime.cpp
// 日期: 2010/04/04
// 作者:
// 说明:
//       简单的时间封装.
///////////////////////////////////////////////////////////////////////////////
#include "SimpleDateTime.h"
namespace DateTime
{
SimpleDateTime::SimpleDateTime(void)
: time_(0)
{
     formatTime();
     calcTimeZone();
}
 
SimpleDateTime::SimpleDateTime(time_t time)
: time_(time)
{
     formatTime();
     calcTimeZone();
}
 
SimpleDateTime::SimpleDateTime(int year, int month, int day)
{
     calcTimeZone();
 
     tm_time_.tm_year = year - 1900;
     tm_time_.tm_mon = month - 1;
     tm_time_.tm_mday = day;
     tm_time_.tm_hour = 0;
     tm_time_.tm_min = 0;
     tm_time_.tm_sec = 0;
     tm_time_.tm_isdst = 0;
 
     time_ = mktime(&tm_time_);
}
 
SimpleDateTime::SimpleDateTime(int year, int month, int day,
                                    int hour, int minute, int second)
{
     calcTimeZone();
     tm_time_.tm_year = year - 1900;
     tm_time_.tm_mon = month - 1;
     tm_time_.tm_mday = day;
     tm_time_.tm_hour = hour;
     tm_time_.tm_min = minute;
     tm_time_.tm_sec = second;
     tm_time_.tm_isdst = 0;
 
     time_ = mktime(&tm_time_);
}
 
SimpleDateTime::SimpleDateTime(int year, int month, int day, int timeZone)
{
     timeZone_ = timeZone;
 
     tm_time_.tm_year = year - 1900;
     tm_time_.tm_mon = month - 1;
     tm_time_.tm_mday = day;
     tm_time_.tm_hour = 0;
     tm_time_.tm_min = 0;
     tm_time_.tm_sec = 0;
     tm_time_.tm_isdst = 0;
 
     time_ = mktime(&tm_time_);
}
 
SimpleDateTime::SimpleDateTime(int year, int month, int day,
                                    int hour, int minute, int second, int timeZone)
{
     timeZone_ = timeZone;
 
     tm_time_.tm_year = year - 1900;
     tm_time_.tm_mon = month - 1;
     tm_time_.tm_mday = day;
     tm_time_.tm_hour = hour;
     tm_time_.tm_min = minute;
     tm_time_.tm_sec = second;
     tm_time_.tm_isdst = 0;
 
     time_ = mktime(&tm_time_);
}
 
SimpleDateTime::SimpleDateTime(const SimpleDateTime & right)
: time_(right.time_)
, tm_time_(right.tm_time_)
, timeZone_(right.timeZone_)
{   
    
}
 
SimpleDateTime::~SimpleDateTime(void)
{
}
 
SimpleDateTime & SimpleDateTime::operator=(const SimpleDateTime & right)
{
     if (this != &right)
     {
         time_ = right.time_;
         timeZone_ = right.timeZone_;
         tm_time_ = right.tm_time_;
     }
 
     return *this;
}
 
// operator
bool SimpleDateTime::operator==(const SimpleDateTime & right) const
{
     return (time_ == right.time_);
}
 
bool SimpleDateTime::operator!=(const SimpleDateTime & right) const
{
     return !(*this == right);
}
 
// function
void SimpleDateTime::currentTime(void)
{
     time(&time_);
     formatTime();
}
 
SimpleDateTime SimpleDateTime::toLocalTime()
{
     SimpleDateTime dateTime((time_ + timeZone_ * 60 * 60));
     return dateTime;
}
 
void SimpleDateTime::calcTimeZone()
{
     // 由于使用系统变量有些问题,所以使用时间偏移来确定时区值
     // 标准
     time_t gm_time;
     time(&gm_time);
     struct tm * ptm;
     ptm = gmtime(&gm_time);
     gm_time = mktime(ptm);
 
     // 本地
     time_t local_time;
     time(&local_time);
     ptm = localtime(&local_time);
     local_time = mktime(ptm);
 
     // 偏移
     long tz = local_time - gm_time;
     int tzHour = (int)(tz / (60 * 60));
     timeZone_ = tzHour;
 
}
 
time_t SimpleDateTime::toTime_t() const
{
     return time_;
}
 
void SimpleDateTime::formatTime()
{
     struct tm * tm_time;
     tm_time = gmtime(&time_);
     tm_time_ = *tm_time;
}
 
// detail information.
int SimpleDateTime::getYear() const {
     return tm_time_.tm_year + 1900;
}
int SimpleDateTime::getMonth() const {
     return tm_time_.tm_mon + 1;
}
int SimpleDateTime::getDay() const {
     return tm_time_.tm_mday;
}
int SimpleDateTime::getHour() const {
     return tm_time_.tm_hour;
}
int SimpleDateTime::getMinute() const {
     return tm_time_.tm_min;
}
int SimpleDateTime::getSecond() const {
     return tm_time_.tm_sec;
}
 
int SimpleDateTime::getWeek() const {
     return tm_time_.tm_wday;
}
 
int SimpleDateTime::getIsdst() const {
     return tm_time_.tm_isdst;
}
int SimpleDateTime::getTimeZone() const {
     return timeZone_;
}
 
}
 
 
用例:
#include <iostream>
#include <string>
#include "SimpleDateTime.h"
using namespace DateTime;
void print_dateTime(SimpleDateTime dt)
{
     std::cout << "DateTime : " << dt.getYear()
              << "-" << dt.getMonth() << "-" << dt.getDay()
              << " " << dt.getHour() << ":" << dt.getMinute() << ":" << dt.getSecond()
              << " DST(" << dt.getIsdst() << ") TimeZone(" << dt.getTimeZone() << ")"
              << " Week(" << dt.getWeek() << ")"
              << std::endl;
 
}
 
int main()
{
     SimpleDateTime dt;
     dt.currentTime();
     std::cout << "GM time " << std::endl;
     print_dateTime(dt);
     SimpleDateTime localTime = dt.toLocalTime();
     std::cout << "LocalTime " << std::endl;
     print_dateTime(localTime);
     SimpleDateTime time1(2010,4,5);
     std::cout << "2010-4-5 " << std::endl;
     print_dateTime(time1);
     SimpleDateTime time2(2010,4,5,12,15,33);
     std::cout << "2010,4,5,12,15,33 " << std::endl;
     print_dateTime(time2);
     return 0;
}
 
运行结果:
 
E:/root/workspace/MyWork/bin>TimerCalc.exe
GM time
DateTime : 2010-4-4 8:4:59 DST(0) TimeZone(8) Week(0)
LocalTime
DateTime : 2010-4-4 16:4:59 DST(0) TimeZone(8) Week(0)
2010-4-5
DateTime : 2010-4-5 0:0:0 DST(0) TimeZone(8) Week(1)
2010,4,5,12,15,33
DateTime : 2010-4-5 12:15:33 DST(0) TimeZone(8) Week(1)
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息