DateTime的6个字节时间戳

时间:2012-04-11 14:09:42

标签: c# datetime

我使用第三方API。根据其规格如下

  byte[] timestamp = new byte[] {185, 253, 177, 161, 51, 1}

代表 1970年1月1日消息时的毫秒数 为传输而生成

问题在于我不知道如何将其翻译成DateTime。

我试过

DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
long milliseconds = BitConverter.ToUInt32(timestamp, 0);
var result =  Epoch + TimeSpan.FromMilliseconds(milliseconds);

结果是{2/1/1970 12:00:00 AM},但预计2012年。

2 个答案:

答案 0 :(得分:4)

        byte[] timestamp = new byte[] { 185, 253, 177, 161, 51, 1, 0, 0, };
        DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        ulong milliseconds = BitConverter.ToUInt64(timestamp, 0);
        var result = Epoch + TimeSpan.FromMilliseconds(milliseconds);

结果是11/14/2011

为CodeInChaos添加特殊的填充代码:

    byte[] oldStamp = new byte[] { 185, 253, 177, 161, 51, 1 };
    byte[] newStamp = new byte[sizeof(UInt64)];
    Array.Copy(oldStamp, newStamp, oldStamp.Length);

在大端机器上运行:

if (!BitConverter.IsLittleEndian)
{
    newStamp = newStamp.Reverse().ToArray();
}

答案 1 :(得分:3)

我认为timestamp使用小端格式。我也省略了参数验证。

long GetLongLE(byte[] buffer,int startIndex,int count)
{
  long result=0;
  long multiplier=1;
  for(int i=0;i<count;i++)
  {
    result += buffer[startIndex+i]*multiplier;
    multiplier *= 256;
  }
  return result;
}

long milliseconds = GetLongLE(timestamp, 0, 6);