C# 将System::DateTime转换为_-timeb
我有一个传统的基于C++的应用程序,它使用CRT ftime函数为传入的网络流量添加时间戳。_ftime函数返回一个_timeb结构,该结构具有32位和64位实现。我们使用的是32位实现,如下所示:C# 将System::DateTime转换为_-timeb,c#,c++,datetime,.net-3.5,C#,C++,Datetime,.net 3.5,我有一个传统的基于C++的应用程序,它使用CRT ftime函数为传入的网络流量添加时间戳。_ftime函数返回一个_timeb结构,该结构具有32位和64位实现。我们使用的是32位实现,如下所示: struct _timeb { long time; // 4 bytes unsigned short millitm; // 2 bytes short timezone; // 2 bytes short dstflag
struct _timeb {
long time; // 4 bytes
unsigned short millitm; // 2 bytes
short timezone; // 2 bytes
short dstflag; // 2 bytes
};
根据MSDN文档,以下是每个字段的解释方式:
dstflag-非零如果夏时制当前对本地时区有效,请参见_tzset以了解如何确定夏时制。
millitm-毫秒中的几分之一秒
时间-自1970年1月1日午夜00:00:00(协调世界时UTC)以来的时间(秒)。
时区-UTC和当地时间之间向西移动的分钟差。时区的值由全局变量_timezonesee _tzset的值设置。
我正在重新处理代码中的时间戳部分,以便在.NET3.5中使用C。现在使用Stask.DATETIME结构生成时间戳,但我仍然需要将它们转换回“YiTimeB”结构,以便传统C++代码可以对它们进行操作。下面是我在托管C++桥库中如何进行:
DateTime dateTime = DateTime::UtcNow;
DateTime baseTime(1970, 1, 1, 0, 0, 0, DateTimeKind::Utc);
TimeSpan delta = dateTime - baseTime;
_timeb timestamp;
timestamp.time = delta.TotalSeconds;
timestamp.millitm = dateTime.Millisecond;
timestamp.dstflag = TimeZoneInfo::Local->IsDaylightSavingTime(dateTime) ? 1 : 0;
timestamp.timezone = TimeZoneInfo::Local->BaseUtcOffset.TotalMinutes * -1;
据我所知,这似乎重建了_timeb结构,就像我直接调用了_ftime一样,这很好。问题是,时间戳是我们应用程序的一个关键部分,所以这必须是正确的
我的问题有两个方面
我的算法有缺陷吗?有人看到我错过的任何明显的东西吗?是否存在边界条件,这将无法正常工作?
有没有更好的转换方法?NET有没有一种更直接的方法来实现这一点?
你知道Y2K38问题吗?我想你查过时区的标志了。避免使用dateTime的聪明。毫秒,这只会让下一个家伙感到困惑。否则看起来不错。不用太担心Y2K38:关于dateTime.毫秒的聪明,你是什么意思?这个答案如何解决你的问题?隐马尔可夫模型