年月日时间和64位时间的使用及相互转换

通常在我们的程序中,需要使用到年月日类型的时间,也需要使用64位整型的时间,比如存储到数据库中(数据库中对应的时间字段的类型则为big int数据类型)。代码中会涉及到如何获取当前时间,以及年月日时间和64位时间之间的转换问题。下面就自己遇到的实际情况,做一个小的总结。

1、获取当前时间

获取当前时间的时间有多种,下面说说使用time函数,使用CTime类和使用SYSTEMTIME结构体这三种常见的获取当前时间的方法。

(1)使用time函数获取当前时间

使用该函数的时候应该包含time.h头文件,使用该函数获取当前的64位时间最为简单。

    __time64_t curTime = ::time(NULL);  

该方法在线程函数中比较实用,可以进行时间上的控制,通常线程函数都是一个循环体,在每次循环开始的时候,都获取一下当前的时间,比如:

(i)在客户端的一个线程中,一方面要定时地给服务器发送心跳包数据(假如每隔10秒),另一方面又要进行其他的数据收发工作,而这些数据又要实时的的收发,所以在该线程中不能等待10秒钟后发送心跳包,然后再收发其他的数据,这个时候我们就可以定义一个__time64_t类型的时间变量,记录最后一次发送心跳包的时间,这样在线程函数的循环中,每次循环只需要等待一个微小的时间就进入下一次循环,在实时收发数据的同时判断当前时间离最后一次发心跳包的时间间隔是否已经到达10秒,若到达则发送新的心跳包,并更新最后一次心跳包发送的时间。

(ii)在视频监控系统中,有计划录像的概念,那录像的计划是如何实现的呢?是如何进行调度的呢?这里就简要的说明一下,开启一个录像调度的线程,在该线程中遍历录像对象列表,对象中包含录像计划的开始时间和结束时间,当当前时间大于或等于开始录像时间时,就开始录像,当当前时间大于或等于结束录像时间时,就结束录像。

(2)使用CTime类获取当前时间

由于该方法使用到CTime MFC类,所以只能应用于MFC的工程中。首先定义一个CTime类对象,然后调CTime::GetCurrentTime()获取当前时间,最后利用GetYear( ),GetMonth( ),GetDay( ),GetHour( ),GetMinute( )和GetSecond( )等函数得到具体的年月日时分秒信息。

    CTime curTime;
    curTime = CTime::GetCurrentTime();
    CString strCurTime;
    strCurTime.Format( _T("%04d/%02d/%02d %02d:%02d:%02d"), curTime.GetYear(), curTime.GetMonth(), curTime.GetDay(),
             curTime.GetHour(), curTime.GetMinute(), curTime.GetSecond() );
    ......//将时间显示出来  

(3)使用SYSTEMTIME结构体获取当前时间

与CTime类处理的类似,先定义一个结构体对象,然后调用GetLocalTime函数来获取当前时间,结构体对象的成员中则包含有年月日信息。与CTime类不同的是,该方法可以应用与MFC工程中,也可以用于Win32工程中。

    SYSTEMTIME curTime;
    GetLocalTime(&curTime);
    CString strCurTime;
    strCurTime.Format( _T("%04d/%02d/%02d %02d:%02d:%02d"), curTime.wYear, curTime.wMonth, curTime.wDay,
            curTime.wHour, curTime.wMinute, curTime.wSecond );
    ......//将当前时间显示出来

2、年月日时间和64位时间的相互转化

64位时间保存到数据库是很方便的,之前也有很多人问过如何将年月日时间保存到数据库中,我觉得将他们转化为64位时间后在保存到数据库中比较好,数据库中只要有一个big int时间字段就可以了,这样不仅简化了时间的保存方法,还有利于数据表的排序查询。界面中数据要保存到数据库中,要将之转化为64为时间;从数据库中读出64为时间,要将之转化为年月日时间在界面上显示出来。

(1)使用CTime类实现年月日时间和64位时间的相互转化

(i)年月日时间转化为64位时间: 构造CTime类对象时,将年月日信息作为构造参数。

    CTime thatTime(2010, 10, 06, 19, 22, 55);
    __time64_t thatTime_64t = thatTime.GetTime();  

(ii)64位时间转化为年月日时间: 构造CTime类对象时,将64位时间作为构造参数。

    __time64_t tahtTime;
    ......//中间处理,获取64位时间
    CTime ctThatTime(tahtTime);
    CString strThatTime;
    strThatTime.Format( _T("%04d/%02d/%02d %02d:%02d:%02d"), ctThatTime.GetYear(), ctThatTime.GetMonth(), ctThatTime.GetDay(),
              ctThatTime.GetHour(), ctThatTime.GetMinute(), ctThatTime.GetSecond() );
    ......  

上述方法适用于MFC工程中,而在非MFC的工程中则要使用到tm结构体。

(2)使用tm结构体实现年月日时间和64位时间的相互转化

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 */
        };

(i)年月日时间转化为64位时间: 首先使用SYSTEMTIME结构体来获取当前的时间,然后利用tm结构体将获得年月日时间转化为64位时间。

    SYSTEMTIME curTime;
    GetLocalTime( &curTime );
    struct tm tmTime;
    tmTime.tm_year = curTime.wYear - 1900;
    tmTime.tm_mon = curTime.wMonth;
    tmTime.tm_mday = curTime.wDay;
    tmTime.tm_hour = curTime.wHour;
    tmTime.tm_min = curTime.wMinute;
    tmTime.tm_sec = curTime.wSecond;
    __time64_t curTime_64t = _mktime64( &tmTime );   

(ii)64位时间转化为年月日时间: 首先将64位时间转化为tm结构体时间,然后再转化成年月日时间。

    __time64_t tahtTime;
    ......//获取64位时间
    tm *tmThatTime = _localtime64( &thatTime );
    char cThatTime[30];
    memset( cThatTime, 0, 30 );
    sprintf( cThatTime, "%04d/%02d/%02d %02d:%02d:%02d", tmThatTime->tm_year+1900, tmThatTime->tm_mon+1,
          tmThatTime->tm_mday, tmThatTime->tm_hour, tmThatTime->tm_min, tmThatTime->tm_sec );
    ......  
时间: 2024-10-13 06:25:44

年月日时间和64位时间的使用及相互转换的相关文章

64位BASM学习随笔(一)

?? Delphi的BASM一直是我最喜爱的内嵌汇编语言,同C/C++的内联汇编相比,它更方便,更具灵活性,因为C/C++的内联汇编只能是或插入式的汇编代码,函数花括号背后隐藏的函数框架,限制了汇编代码的发挥,如无论有无参数和局部变量,总是有个栈框架,更烦人的是只要你在函数中使用了esi,edi,ebx寄存器,就自动给你保存和恢复,使得这些寄存器没法在函数之间传递信息等:而Delphi的BASM可以是插入式的汇编代码,也可是完全的汇编方法,在完全的汇编方法下,怎么发挥就是自己的事了.    De

Centos 6.5 64位双网卡绑定

1.环境描述      我的Vmware workstation 10 安装Centos 6.5 64位加上双口的Intel千兆网卡,通过ifconfig -a|grep eth命令看到eth2和eth3两张网卡. 2.双网卡绑定步骤: 2.1 修改/etc/sysconfig/network-scripts/ifcfg-eth2配置文档,修改后的内容如下:    DEVICE=eth2       ONBOOT=yes              #系统启动时自动启用该设备    BOOTPRO

【OSG学习笔记之一:】OSG+VS2010+win7 64位环境搭建

虽然出生的时候,没有说过“Hello World!”,但是自从走上了编程之路,每一次输出“Hello World!”的时候,都觉得好比中了彩票大奖似的: 仔细算算,从2012年暑假到现在,经历了3年半的光阴,这段时间,不仅是知识.阅历.成长获得最大的一段,也是人生的一大转折点.在这期间,得以继续深造学习自己的专业,虽然踏入这行的时候,也是调剂来的,但是我用这3年的时间,恶补自己7年的不足:2015年,发生了三件大事,我毕业了,我工作了,我有女票了(三件事的重要程度递增):吃得苦中苦,方位人上人,

win7 64位安装redis 及Redis Desktop Manager使用(转载的)

写基于dapper的一套自动化程序,看到 mgravell的另一个项目,StackExchange.Redis,之前在.NET上用过一段时间Redis,不过一直是其它的驱动开发包,这个根据作者介绍,是个高性能的线程安全的.NET c#开发redis客户端的库.说的很吊,不过我确信mgravell出品的东西都是精品.说多无益,先把redis在win上的开发环境搭一下. redis官方没有64位的Windows下的可执行程序,目前有个开源的托管在github上, 地址:https://github.

centos6.5 64位ssl_version 是 NSS,不是openssl

公司服务器采用的centos6.5的64位,在yum安装完php nginx环境后,发现有些时间使用curl出错,经过测试发现其默认的curl是NSS,而不是openssl,现将NSS转换成openssl过程记录. 首先查看curl版本会发现并不是openssl curl -V libcurl/7.19.7 NSS/3.35 zlib/1.2.3 因为centos 6.5(我是用的版本,其他版本没有测试)默认安装curl是用ssl的版本是NSS 所以需要对Curl进行重新编译 先去官方下载 ht

驱动级多开工具,支持32位和64位

标题:[原创]驱动级多开工具,支持32位和64位 作者:绿林科技 时间:2015-5-16 链接:http://blog.csdn.net/o6108/article/details/47790019 作者QQ:1473656864 技术交流群1:177822108 技术交流群2:177822398 通用驱动级多开器,可多开市面上的90%的程序. PS:本来想弄个收费版本的,后来想了想,决定弄成免费.店铺为更新软件版本用的. 软件的About页面有我的QQ和Q群号,请大家把使用过程中遇到的BUG

机器字长 32位与64位的区别

1.64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存 2.64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会提升1倍.但这是建立在64bit操作系统,64bit软件的基础上的 3. 32位/64位处理器指的是CPU在同一时间内能处理的数据位数(8位=1B),机器字长一般是指参加运算的寄存器所含有的二进制数的位数,它代表了机器的精度. 如 某计算机字长32位,存储容量8MB.按字编址,其寻址范围为 8MB字节=8*1024*1024*8位.所

windows 64位整数

#include <iostream> #include <ctime> using namespace std; int main() { cout << sizeof(long) << endl;//4 cout << sizeof(long long) << endl;//8 cout << sizeof(__int64) << endl;//8 //time_t在64位上为__time64_t,为__i

SAS9.3 64位版Win7安装指引

SAS9.3 64位版安装指引 换了新电脑,安装原来使用的SAS9.2之后,增强型编辑器一直不能被加载,尝试了各种方法,浪费了一天的时间.无奈下载了SAS9.3 64位版本,但是安装也不顺利,当然主要是JDK出现了问题,参考了网友的文章,顺利完成了安装,另注操作系统为win7 64位版. 原文地址:http://f.dataguru.cn/thread-161588-1-1.html 1,主要流程,来源于网络: 操作系统: win7中文旗舰版 64位 SAS: 9.3 64位 安装之前的准备工作