在 C# 中计算特定编码的日期时间

问题描述 投票:0回答:1

我有一个从设备接收 GPS 报告的项目。它有效,但我正在彻底修改我的单元测试并添加集成测试,以便在发布到生产时减少恐慌。一旦特定的设备模型使用非常紧凑的二进制文件作为报告,我花了过去三周的时间对我自己的解析器进行逆向工程,这样我就可以为单元和集成测试生成随机或特定的报告。

我很确定我已经弄清楚了除了时间戳之外的所有部分。我似乎无法生成正确的时间戳,所以我决定寻求帮助。

设备的文档将时间戳指定为:

时间戳是一个 4 字节字段,用于标识报告的生成时间(可能与传输报告的时间不同)。该字段的值是一个无符号整数,表示采用以下编码的协调世界时 (UTC):

<seconds> = <timestamp> % 60
<minutes> = int( <timestamp> / 60 ) % 60
<hours> = int( <timestamp> / (60*60) ) % 24
<days> = 1 + int( <timestamp> / (60*60*24) ) % 31
<month> = 1 + int( <timestamp> / (60*60*24*31) ) % 12 (where 1 = Jan, 2 = Feb, etc.)
<year> = 2000 + int( <timestamp> / (60*60*24*31*12) )

从我一直用于测试的真实设备的一份报告中,我知道

2020-06-03 22:01:52 +00:00
656460112
,但我不知道如何将时间戳传递给我的方法并生成该值。这是我到目前为止的方法:

private const int _millennium = 946684800;

private static byte[] GetLocatedAtUtcBytes(
    DateTimeOffset locatedAtUtc) {
    var bytes = new byte[4];

    BinaryPrimitives.WriteInt32BigEndian(bytes, (int)(locatedAtUtc.ToUnixTimeSeconds() - _millennium));

    return bytes;
}

我认为我必须以某种方式扣除千年,因为他们的公式希望我明确添加

2000
来获得年份,但这似乎并没有让我到达我需要的地方。我的方法生成
644536912
作为值,恰好是 138 天休息。盲目加138,其他日期都解决不了。

我希望能得到一些帮助来生成正确的值,因为我已经花了太多天了,而我现在只是在原地打转,并且变得斗鸡眼。这可能很简单,但我再也看不到了。任何帮助将不胜感激!

c# .net gps
1个回答
0
投票

如果假设 644536912 是距离给定时间的秒数,则起始时间为 8/16/1999 的凌晨 12:00。因此,所有时间都将从此时开始,给定一个刻度是一秒的间隔。

DateTime 纪元开始 = new DateTime(2020, 6, 3, 22, 1, 52);

int cdrTimestamp = -656460112;

日期时间结果 = epochStart.AddSeconds(cdrTimestamp);

结果 = 1999 年 8 月 16 日中午 12:00

© www.soinside.com 2019 - 2024. All rights reserved.