Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换负历元时间的公式是什么?_C#_Unix Timestamp - Fatal编程技术网

C# 转换负历元时间的公式是什么?

C# 转换负历元时间的公式是什么?,c#,unix-timestamp,C#,Unix Timestamp,我对负历元时间有问题。我有一个第三方程序,可以生成大纪元时间。我正在使用该程序为我生成纪元时间,我将日期和时间保持不变,同时只更改年份以获得下面的纪元时间进行测试。对于所有yyyy,我的日期和时间应为01/01/yyyy 12:00:00 AM 这就是我所拥有的: var epoch = new DateTime(1904, 1, 1, 0, 0, 0, DateTimeKind.Utc); var ofset = 6*60*60; // 6hr different

我对负历元时间有问题。我有一个第三方程序,可以生成大纪元时间。我正在使用该程序为我生成纪元时间,我将日期和时间保持不变,同时只更改年份以获得下面的纪元时间进行测试。对于所有yyyy,我的日期和时间应为01/01/yyyy 12:00:00 AM

这就是我所拥有的:

 var epoch = new DateTime(1904, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        var ofset = 6*60*60; // 6hr different

        Console.WriteLine("1900: " + epoch.AddSeconds(-126122400 - ofset)); // 1900
        Console.WriteLine("1904: " + epoch.AddSeconds(21600 - ofset)); // 1904
        Console.WriteLine("1905: " + epoch.AddSeconds(31644000 - ofset)); // 1905
        Console.WriteLine("1970: " + epoch.AddSeconds(2082866400 - ofset)); // 1970
        Console.WriteLine("1971: " + epoch.AddSeconds(2114402400 - ofset)); // 1971
        Console.WriteLine("1972: " + epoch.AddSeconds(2145938400 - ofset)); // 1972
        Console.WriteLine("1973: " + epoch.AddSeconds(-2117406496 - ofset)); // 1973
        Console.WriteLine("1974: " + epoch.AddSeconds(-2085870496 - ofset)); // 1974
        Console.WriteLine("2016: " + epoch.AddSeconds(-760494496 - ofset)); // 2016
输出为:

1900: 1/1/1900 12:00:00 AM
1904: 1/1/1904 12:00:00 AM
1905: 1/1/1905 12:00:00 AM
1970: 1/1/1970 12:00:00 AM
1971: 1/1/1971 12:00:00 AM
1972: 1/1/1972 12:00:00 AM
1973: 11/24/1836 5:31:44 PM
1974: 11/24/1837 5:31:44 PM
2016: 11/24/1879 5:31:44 PM
如您所见,从1973行开始(大纪元时间为负数),日期、年份和超时都是错误的。我应该怎么做才能得到正确的日期、年份和时间

更新:

对于日期设置为2016年5月26日上午10:11:45.654的原始数据,我在数据库中看到:

<Timestamp>
            <Name>Date Created</Name>
            <Cluster>
                <Name></Name>
                <NumElts>4</NumElts>
                <I32>
                    <Name></Name>
                    <Val>0</Val>
                </I32>
                <I32>
                    <Name></Name>
                    <Val>-1482223616</Val>
                </I32>
                <I32>
                    <Name></Name>
                    <Val>-747850591</Val>
                </I32>
                <I32>
                    <Name></Name>
                    <Val>0</Val>
                </I32>
            </Cluster>
        </Timestamp>

创建日期
4.
0
-1482223616
-747850591
0

我想我发现了问题:整数溢出。我不知道发生在哪里,但这就是问题所在

考虑一下,从1904/01/01到1973/01/01的秒数是2177539200。整数的最大值为2147483648。因此,1973年的偏移值大于整数中的偏移值

如果将数字2177539200转换为
int
,则得到的值为-2117428096。如果你把这个数字加到你的日期计算中,你会得到1836/11/2417:31:44。以下是测试代码:

private static void Main(string[] args)
{
    var epoch = new DateTime(1904, 01, 01, 0, 0, 0, DateTimeKind.Utc);
    var offset = TimeSpan.FromHours(6);

    // How many seconds between 1904/01/01 and 1973/01/01?
    var timestamp1973 = (new DateTime(1973, 01, 01, 0, 0, 0, DateTimeKind.Local) - epoch).TotalSeconds;
    Console.WriteLine("1973 timestamp = {0:N0}", timestamp1973);
    Console.WriteLine("Verify calculation: {0}", epoch.AddSeconds(timestamp1973));

    // How many seconds is that different from int.MaxValue?
    var overflow = timestamp1973 - int.MaxValue;
    Console.WriteLine("Overflow = {0:N0}", overflow);

    // So take int.MaxValue and add the overflow
    var wrongTimeStamp = int.MaxValue;
    wrongTimeStamp += (int) overflow;
    Console.WriteLine("wrong time stamp = {0:N0}", wrongTimeStamp);

    // And the calculation with that value is:
    Console.WriteLine("Wrong date = {0}", epoch.AddSeconds(wrongTimeStamp));
    Console.ReadLine();
}
以及输出:

1973 timestamp = 2,177,539,200
Verify calculation: 1973-01-01 00:00:00
Overflow = 30,055,553
wrong time stamp = -2,117,428,096
Wrong date = 1836-11-24 17:31:44
因此,要么是第三方程序错误地向您发送数据中的有符号32位整数,要么是程序中的某些内容错误地将LabView创建的有符号64位数字转换为有符号32位数字。在某个地方,有人将64位转换为32位,然后事情就发生了变化

评论之后 如果数据确实是有符号整数,那么看起来您唯一的选择就是将其视为无符号。这将阻止您显示1904年之前的日期,但它将为您提供到2040年2月的范围。为此:

int signedValue = ReadFromDatabase();
uint unsignedValue = (uint)signedValue;
var theDate = epoch.AddSeconds(unsignedValue);

我想我发现了问题:整数溢出。我不知道发生在哪里,但这就是问题所在

考虑一下,从1904/01/01到1973/01/01的秒数是2177539200。整数的最大值为2147483648。因此,1973年的偏移值大于整数中的偏移值

如果将数字2177539200转换为
int
,则得到的值为-2117428096。如果你把这个数字加到你的日期计算中,你会得到1836/11/2417:31:44。以下是测试代码:

private static void Main(string[] args)
{
    var epoch = new DateTime(1904, 01, 01, 0, 0, 0, DateTimeKind.Utc);
    var offset = TimeSpan.FromHours(6);

    // How many seconds between 1904/01/01 and 1973/01/01?
    var timestamp1973 = (new DateTime(1973, 01, 01, 0, 0, 0, DateTimeKind.Local) - epoch).TotalSeconds;
    Console.WriteLine("1973 timestamp = {0:N0}", timestamp1973);
    Console.WriteLine("Verify calculation: {0}", epoch.AddSeconds(timestamp1973));

    // How many seconds is that different from int.MaxValue?
    var overflow = timestamp1973 - int.MaxValue;
    Console.WriteLine("Overflow = {0:N0}", overflow);

    // So take int.MaxValue and add the overflow
    var wrongTimeStamp = int.MaxValue;
    wrongTimeStamp += (int) overflow;
    Console.WriteLine("wrong time stamp = {0:N0}", wrongTimeStamp);

    // And the calculation with that value is:
    Console.WriteLine("Wrong date = {0}", epoch.AddSeconds(wrongTimeStamp));
    Console.ReadLine();
}
以及输出:

1973 timestamp = 2,177,539,200
Verify calculation: 1973-01-01 00:00:00
Overflow = 30,055,553
wrong time stamp = -2,117,428,096
Wrong date = 1836-11-24 17:31:44
因此,要么是第三方程序错误地向您发送数据中的有符号32位整数,要么是程序中的某些内容错误地将LabView创建的有符号64位数字转换为有符号32位数字。在某个地方,有人将64位转换为32位,然后事情就发生了变化

评论之后 如果数据确实是有符号整数,那么看起来您唯一的选择就是将其视为无符号。这将阻止您显示1904年之前的日期,但它将为您提供到2040年2月的范围。为此:

int signedValue = ReadFromDatabase();
uint unsignedValue = (uint)signedValue;
var theDate = epoch.AddSeconds(unsignedValue);


为什么您希望在1904年的日期上加上负秒会导致1973年的日期?如果纪元是1904/01/01,负数表示1900/01/01,那么您会期望较小的数字(即绝对值较大的负数)表示纪元之前的日期。我觉得你的数据有点不对劲。为什么纪元定在1904年1月1日?历元为1970年1月1日。历元由labview生成。请看这里,有人有什么建议吗?查看此链接,我发现mac很常见,为什么您希望在1904年的日期上加上负秒会导致1973年的日期?如果纪元是1904/01/01,负数表示1900/01/01,那么您会期望较小的数字(即绝对值较大的负数)表示纪元之前的日期。我觉得你的数据有点不对劲。为什么纪元定在1904年1月1日?历元为1970年1月1日。历元由labview生成。请看这里,有人有什么建议吗?看看这个链接,我发现mac hi Jim很常见。这对我来说也是多余的。但是,我正在使用第三方程序并指定日期。然后,第三方程序将日期插入数据库。我基本上是复制和粘贴数据库中显示的日期。此外,我还检查了第三方程序是否能够检索到日期并正确显示。@user1801381:然后第三方程序知道一些您不知道的数据。数据库中的字段是否可能是64位数字?另一个程序可以将该值视为未签名,这将适用于正数日期,但不能表示1904年之前的任何值。如果另一个程序可以读取和显示数据,这让我相信你的程序误解了事情,很可能是从数据库中获取了值。嗨,吉姆。我不使用任何代码手动执行复制和粘贴,所以这不是一个铸造问题。数据库中的字段类型为字符串nvarchar(max)。请查看我从原始数据中获取的值的更新问题。@user1801381:在我看来,您唯一能做的就是将其视为未签名。这将阻止您显示1904年之前的任何日期。你能代表的最长日期是2040年6月2日06:28:15。一秒钟后,无符号整数滚动,您将返回到1904。@user1801381:我添加了一个转换为无符号整数的示例。嗨,吉姆。这对我来说也是多余的。但是,我正在使用第三方程序并指定日期。日期