思路可以把DateTime和一个时间戳相减得到TimeSpan类型,然后转化成秒数得到byte数组 由数组转化成ToString(“X2”)
反之则反, 下面上代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace Commom
{
public class DateTimeInterHex
{
/// <summary>
/// 把一个时间转化成四个字节的16进制字符串
/// </summary>
/// <param name="time">要转化的时间</param>
/// <returns></returns>
public static String TimeToHex(DateTime time)
{
StringBuilder sb = new StringBuilder();
DateTime timeStar = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime (1970,01,01));
TimeSpan timeSpan= time - timeStar;
uint unitSpan= Convert.ToUInt32(timeSpan.TotalSeconds);
if (unitSpan<0)
{
return sb.ToString();
}
byte[] bytes = System.BitConverter.GetBytes(unitSpan);
for (int i = bytes.Length-1; i >= 0; i--)
{
sb.Append(bytes[i].ToString("X2"));
}
return sb.ToString();
}
/// <summary>
/// 把十六进制数据转化成时间
/// </summary>
/// <param name="HexStr">16进制数据字符串</param>
/// <returns></returns>
public static DateTime HexToTime(string HexStr)
{
HexStr = HexStr.Replace(" ", "");
DateTime time = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970,01,01));
if (HexStr.StartsWith("oX")||HexStr.StartsWith("OX"))
{
HexStr = HexStr.Substring(2, HexStr.Length - 2);
}
if (HexStr.Length%2!=0)
{
HexStr += " ";
}
byte[] bytes=new byte[HexStr.Length/2];
for (int i = 0; i < bytes.Length; i++)
{
bytes[bytes.Length-1-i] = Convert.ToByte(HexStr.Substring(i * 2, 2), 16);
}
uint unitSpan = System.BitConverter.ToUInt32(bytes, 0);
return time.AddSeconds(unitSpan);
}
}
}
测试文本 2009-12-19 13:55:11 转成 4B 2C 6A BF
4B 2C CD 2F 转成 2009-12-19 20:55:11
2020/4/8 17:04:53转化成 5E8D93B5