time_t和DATE之间的相互转化

两者的差别:

time_t是整型,存储着至1970-1-1 00:00:00的时差(秒数)(UTC时间)

DATA是浮点型,整数部分存储着至1899-12-30 00:00:00的时差(天数)(本地时间), 小数部分存储着时分秒。(BTW:DATA可以表示基点之前的时间,time_t不可以)

本算法只是想说明两者之间转化是很easy的,不需要MFC的支持,不需要“晕倒 ”,因此以下两点不考虑:

a. 不考虑Local Time和UTC之间的时差(这玩意儿看起来就不爽,还是time_t好啊,一个 time_t就够了,DATE还得知道它用的时区,否则有了数值也没屁用) ------- 既然有人问我 怎么做,那我把这一点也考虑进去吧

b. 不考虑错误数值(比如 time_t(-1) 就是个错误数值 ),不考虑转化失败的情况(因 为两者的表示范围不一样)。

#include <ctime>

inline double timet_to_lotus( time_t t )
{
    //return t/(24*60*60) + 25569  // t/(24*60*60)就只留下天数。time_t以 1970/1/1为起点,lotus以1899/12/30为基点,差25569天
    //    +  t%(24*60*60)/(60*60) / (24.0) // t%(24*60*60)就只留下时分秒 ,再/(60*60)就留下时,除24就转化为lotus时
    //    +  t%(60*60)/(60) / (24.0*60.0) // t%(60*60)就只留下分秒,再/ (60)就留下分,除24*60就转化为lotus分
    //    +  t%60 / (24.0*60.0*60.0);  // t%(60)就只留下秒,除24*60*60就 转化为lotus秒

    return (t+timezone)/(24.0*60.0*60.0) + 25569; // timezone是时区差
}

inline time_t lotus_to_timet( double dt )
{
 return (time_t)( (dt-25569)*(24*60*60)-timezone + 0.5 ); // +0.5是什么原因大家 肯定都知道。俺就奇怪了,这格式是哪个SN制定的,如果当时没有long long,那也宁可用 struct,而不是double
}

// 以下为测试代码
#include <ATLComTime.h>
#include <ctime>
#include <cassert>

int main()
{
    time_t a = time(0);
    COleDateTime b( timet_to_lotus(a) );
    printf( "current UTC time is %04d-%02d-%02d %02d:%02d:%02d\n", b.GetYear(), b.GetMonth(), b.GetDay(), b.GetHour(), b.GetMinute(), b.GetSecond() );

    time_t c = lotus_to_timet( b.m_dt );
    assert( c == a );

    return 0;
}

//////////////////////////////////////////////////////////////////

time_t 和 SYSTEMTIME 之间的相互转化(答[feveny]所问)

#include <ctime>
#include <windows.h>

inline SYSTEMTIME timet_to_systime( time_t t )
{
    tm gm = *localtime( &t );

    SYSTEMTIME st = { 1900+gm.tm_year, 1+gm.tm_mon, gm.tm_wday, gm.tm_mday, gm.tm_hour, gm.tm_min, gm.tm_sec, 0 };
    return st;
}

inline time_t systime_to_timet( const SYSTEMTIME& st )
{
    struct tm gm = { st.wSecond, st.wMinute, st.wHour, st.wDay, st.wMonth-1, st.wYear-1900, st.wDayOfWeek, 0, 0 };

    return mktime( &gm );
}

// 以下为测试代码
#include <ATLComTime.h>
#include <cassert>

int main()
{
    time_t a = time(0);
    SYSTEMTIME b = timet_to_systime( a );
    time_t c = systime_to_timet( b );

    assert( a == c );

    COleDateTime d( a );
    COleDateTime e( b );

    assert( d == e );

    return 0;
}

时间: 2024-12-29 05:39:29

time_t和DATE之间的相互转化的相关文章

c语言与c++语言之间的相互转化

问题描述 c语言与c++语言之间的相互转化 struct student*p0 scanf("%s",p0->num) scanf("%s",&p0->name) 解决方案 C++也能兼容C,直接编译看有没有什么语法错误 解决方案二: 对的,C++编译器本来就支持几乎所有C语法 你为何还需要改 C --> C++ #include scanf("%s",p0->num); --> std::cin >&

php 时间time与日期date之间的使用详解及区别_php技巧

php时间time与日期date之间的使用区别 1.time()函数 PHP中的time()函数,使用echo输出来看是一个很长的整数,里面包含了日期和时间,是计算后的一个值.如果要得到Y-m-d H:i:s这样的日期格式,那么可以使用date方法: date('Y-m-d H:i:s', time()); echo输出它即可得到:2016-1-5 10:20:11 2.日期格式与字符串 我们自己可以构建一个日期格式的字符串,如:2015-1-1 10:20:11.可以使用strtotime()

Android JSON数据与实体类之间的相互转化(GSON的用法)

这篇文章就是示范如何用GSON把JSON数据与实体类进行相互转化,需要用到gson-2.3.1.jar这个包.直接贴代码了: import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken

Java Object类型与值类型之间的相互转化

public static void main(String[] args) { boolean var = true; foo((Object)var); } public static void foo(Object value) { boolean var = (boolean)value; System.out.println(var); } 如上方代码所示,函数foo会传递一个Object类型的变量value过来(传递进来的值确实是布尔值,不要问我为什么不直接在foo函数中将Objec

Axis2中的对象和字符串相互转化

在Web Service中定义了复杂类型之后,Axis2会生成对应的类对象.这些类都是可以序列化的. 可以把这些类的实例和字符串之间做相互转化. // 对象转换成字符串 StringWriter stringWriter = new StringWriter(); XMLStreamWriter xmlStreamWriter = StAXUtils .createXMLStreamWriter(stringWriter); MTOMAwareXMLStreamWriter mtomAwareX

对象-C++多态基类和派生类之间转换

问题描述 C++多态基类和派生类之间转换 #include <iostream> #include<iostream> using namespace std; class A { public: void foo() { printf("1 "); } virtual void fun() { printf("2 "); } }; class B : public A { public: void foo() { printf("

php数据类型之间转换代码

1.PHP字符串转换 数值转字符串就是按照数值原本的格式转换:字符串转换为数字,转换后的数字是从字符串开始部分的数值型字符串,数值型字符串包括正负值和用科学计数法表示的数字. [示例] 请把以下代码复制内容到剪贴板 <?php教程      $number=intval("5.6abc");    //5      $number=(float)"+5.6abc";    //5.6      $number=floatval("-1.2e3f4g5

Java.util.Date类型的转化成为数据库中的Date类型。

最完整的一个网页:http://www.zxbc.cn/html/20080905/65272.html   作者:天涯 来源:中国自学编程网 发布日期:1220576012 在JDK 1.1后,java.util.Date 类型的大多数方法已经不推荐使用了.代替它的是Calendar. 而在java.sql.Date 和 java.util.Date之间,有些微妙的关系. 如何将Date类型插入数据库中,成为好多人的一个不小的障碍. 当然,并不一定要在外部插入时间,因为在数据库中,可以让它自动

WCF技术剖析之十三:序列化过程中的已知类型(Known Type)

DataContractSerializer承载着所有数据契约对象的序列化和反序列化操作.在上面一篇文章(<数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)>)中,我们谈到DataContractSerializer基本的序列化规则:如何控制DataContractSerializer序列化或者反序列化对象的数量:以及如何在序列化后的XML中保存被序列化对象的对象引用结构.在这篇文章中,我们会详细讨论WCF序列化中一个重要的话题:已知类型