我有一种将日期时间转换为DOS格式的方法
它最初是用C#编写的,但是我已经将其转换为powershell。
对两者的相同输入将返回不同的结果。 我正在努力寻找原因。
Powershell方法
Function ConvertTo-DOSDate {
Param(
[DateTime]$dateTime
)
Process {
Try {
[int] $ret = (($dateTime.Year - 1980) -band 0x7F);
$ret = ($ret -shl 4) + $dateTime.Month;
$ret = ($ret -shl 5) + $dateTime.Day;
$ret = ($ret -shl 5) + $dateTime.Hour;
$ret = ($ret -shl 6) + $dateTime.Minute;
$ret = ($ret -shl 5) + ($dateTime.Second / 2); # only 5 bits for second, so we only have a granularity of 2 sec.
return [uint32] $ret;
}
Catch {
throw "Exception: $_"
}
}
}
C#方法
public static uint DateTimeToDosTime(DateTime dateTime)
{
// DateTime must be Convertible to DosTime:
//#Debug.Assert(ValidZipDate_YearMin <= dateTime.Year && dateTime.Year <= ValidZipDate_YearMax);
int ret = ((dateTime.Year - 1980) & 0x7F);
ret = (ret << 4) + dateTime.Month;
ret = (ret << 5) + dateTime.Day;
ret = (ret << 5) + dateTime.Hour;
ret = (ret << 6) + dateTime.Minute;
ret = (ret << 5) + (dateTime.Second / 2); // only 5 bits for second, so we only have a granularity of 2 sec.
return (uint)ret;
}
在Powershell控制台中,我运行:
Add-Type -Path "C:\temp\ClassLibrary1.dll"
$date = New-Object DateTime 2019, 08, 30, 20, 56, 43
$powershellResult = ConvertTo-DOSDate -dateTime $date
$CSharpResult = [TomLib.ZipHelper]::DateTimeToDosTime($date)
write-host "Input Date : $date"
Write-host "Powershell: $powershellResult"
write-host "C#: $CSharpResult"
然后输出
Input Date : 08/30/2019 20:56:43
Powershell: 1327408918
C#: 1327408917
答案 0 :(得分:8)
分割和环绕 当除法运算的商是整数时,PowerShell将值舍入到最接近的整数。值为.5时,将四舍五入为最接近的偶数整数。
以下示例显示了舍入到最接近的偶数整数的效果。
Expression Result
[int]( 5 / 2 ) 2
[int]( 7 / 2 ) 4
Notice how 5/2 = 2.5 gets rounded to 2. But, 7/2 = 3.5 gets rounded to 4.
当C#在int空间中进行除法时,它只会切掉小数部分:
5/2 -> 2,
7/2 -> 3
在powershell中,示例时间的秒部分为43,因此43/2
会四舍五入为22(最接近的偶数整数)
在C#中,43/2
是21
这在结果中引入了一个错误,例如在C#表单中执行ret + 21,在powershell表单中执行$ ret + 22