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)
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)
相关文章推荐
- Qt编程19:Qt时间日期的处理(QTime、QDateTime的使用比较简单)
- [编程练习与总结1] 时间日期格式转换
- js date日期简单封装,时间加减
- c#日期时间的操作的函数总结
- Windows多线程编程总结
- Bootstrap-datepicker日期时间选择器的常见用法总结
- golang -- 时间日期总结
- PHP调用C编程总结(windows)
- 日期时间简单操作
- 日期时间使用总结
- 日期时间使用总结
- 日期时间使用总结
- Windows游戏编程总结(一)图形处理中的几个函数
- MySQL日期数据类型、MySQL时间类型使用总结
- iOS 开发 之网络编程简单总结转载
- MySQL 日期数据类型、时间类型使用总结
- java中关于日期和时间的类的简单用法
- Windows编程-1-字符和字符串处理相关知识点总结
- Windows网络编程入门:简单的客户端和服务器通信程序调试
- MySQL日期数据类型、时间类型使用总结