我正在将C ++程序移植到C#。该程序需要能够读取文件"修改"时间戳并将其存储在List
中。这就是我到目前为止所做的:
C#代码:
ret = new List<Byte>(); //list to store the timestamp
var file = new FileInfo(filename);
//Get revision date/time
DateTime revTime_lastWriteTime_LT = file.LastWriteTime;
//Copy date/time into the List (binary buffer)
ret.Add(Convert.ToByte(revTime_lastWriteTime_LT.Month));
ret.Add(Convert.ToByte(revTime_lastWriteTime_LT.Day));
ret.Add(Convert.ToByte(revTime_lastWriteTime_LT.Year % 100)); // 2-digit year
ret.Add(Convert.ToByte(revTime_lastWriteTime_LT.Hour));
ret.Add(Convert.ToByte(revTime_lastWriteTime_LT.Minute));
ret.Add(Convert.ToByte(revTime_lastWriteTime_LT.Second));
当我读入Hours
值时,会出现问题。如果在夏令时期间(如夏季月份)修改了文件,则C ++程序中的小时值将减1。我似乎无法在我的程序中复制这个。在DateTime
DateTime
中,它表示在&#34;日期时间值&#34;:&#34;本地时间可选择受夏令时影响,夏令时增加或减去一小时一天#34;在我的C#代码中,我确保使用ToLocalTime()
将我的static WIN32_FILE_ATTRIBUTE_DATA get_file_data(const std::string & filename)
{
WIN32_FILE_ATTRIBUTE_DATA ret;
if (!GetFileAttributesEx(filename.c_str(), GetFileExInfoStandard, &ret))
RaiseLastWin32Error();
return ret;
}
//---------------------------------------------------------------------------
static SYSTEMTIME get_file_time(const std::string & filename)
{
const WIN32_FILE_ATTRIBUTE_DATA data(get_file_data(filename));
FILETIME local;
if (!FileTimeToLocalFileTime(&data.ftLastWriteTime, &local))
RaiseLastWin32Error();
SYSTEMTIME ret;
if (!FileTimeToSystemTime(&local, &ret))
RaiseLastWin32Error();
return ret;
}
void parse_asm()
{
// Get revision date/time and size
const SYSTEMTIME rev = get_file_time(filename);
// Copy date/time into the binary buffer
ret.push_back(rev.wMonth);
ret.push_back(rev.wDay);
ret.push_back(rev.wYear % 100); // 2-digit year
ret.push_back(rev.wHour);
ret.push_back(rev.wMinute);
ret.push_back(rev.wSecond);
}
对象更改为当地时间,但显然我还没有设置文章所讨论的选项。 如何在读取夏令时期间修改过的文件时,确保本地时间的DateTime对象减去一个值?
C ++代码以防万一:
{{1}}
为清晰起见而更新:
在Windows时间设置中,我在(UTC-05:00)东部时间(美国和加拿大)。该文件最后修改于2013年9月3日星期二下午12:13:52。 C ++应用程序将小时值显示为11,C#应用程序使用上面的代码将小时值显示为12。我需要C#app来显示与C ++应用程序相同的小时值。
答案 0 :(得分:2)
该错误实际上不是使用.NET,而是使用您的C ++代码。您正在使用FileTimeToLocalFileTime
,其中有一个众所周知的错误,如KB932955中所述:
注意
FileTimeToLocalFileTime()
功能和。{LocalFileTimeToFileTime()
函数执行UTC之间的转换 时间和当地时间仅使用当前时区信息 和DST信息。无论如何都会发生这种转换 正在转换的时间戳。
因此,在2013年9月3日美国东部时区12:13:52给出的示例中,确实应该是夏令时。但是因为它现在 (2015年2月)不是夏令时,所以你目前在C ++程序中获得11小时。如果您在下个月的转换(2015年3月8日)之后运行完全相同的C ++代码,那么您将获得每小时12个。
FileTimeToLocalFileTime
函数MSDN entry的备注部分描述了C ++代码的修复:
要考虑将文件时间转换为本地时间时的夏令时,请使用以下函数序列代替使用
FileTimeToLocalFileTime
:
FileTimeToSystemTime
SystemTimeToTzSpecificLocalTime
- 醇>
SystemTimeToFileTime
现在你已经理解了这个错误 - 如果你真的想在C#中保留这种行为(我不推荐),那么你会做以下事情:
TimeSpan currentOffset = TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow);
DateTime revTime_LastWriteTime_Lt = file.LastWriteTimeUtc.Add(currentOffset);
更好的做法就是保持当前代码不变(使用file.LastWriteTime
),然后修复错误。
答案 1 :(得分:1)
抱歉,您需要使用Add
而不是AddHours
,Add
接受TimeSpan
。所以你在寻找:
file.LastWriteTimeUtc.Add(TimeZoneInfo.Local.BaseUtcOffset);