gpt4 book ai didi

datetime - YYYYMMDDHHMMSS 的最紧字节表示?

转载 作者:行者123 更新时间:2023-12-04 06:15:01 24 4
gpt4 key购买 nike

我需要使用最少数量的字节/字符来打包带有 UTC 日期时间的字符串。我只需要精确到第二个。使用 .NET 4.0,压缩它的最节省空间的方法是什么?蜱似乎并不那么小。

所有的想法都表示赞赏。
谢谢。

编辑:感谢 Joel Coehoorn,打包/解包移动是最好的。谢谢!这里有一些证据:

DateTimeOffset nowStamp = DateTimeOffset.UtcNow;
Console.WriteLine( nowStamp.ToString() ); // 9/9/2011 2:17:17 PM +00:00
Console.WriteLine( nowStamp.ToString( "u" ) ); // 2011-09-09 14:17:17Z
Console.WriteLine( nowStamp.Ticks.ToString() ); // 634511746376767889
Console.WriteLine( PackDate( nowStamp ) ); // 7R9qTgAAAAA=
Console.WriteLine( UnpackDate( PackDate( nowStamp ) ) ); // 9/9/2011 2:17:17 PM +00:00

最佳答案

也许是 unix 时间的变体(自 1970 年 1 月 1 日以来的秒数,而不是毫秒)base64 编码。

//Helpers
private static DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static long toUnixTime(this DateTime d)
{
return (long)((d.ToUniversalTime() - Jan1st1970).TotalMilliseconds);
}

public static string Base64Encode(long toEncode)
{
return Convert.ToBase64String(BitConverter.GetBytes(toEncode));
}

//Encode
public static string PackDate(DateTime toPack)
{
return Base64Encode(toPack.toUnixTime()/1000);
}

//Decode
public static DateTime UnpackDate(string toUnpack)
{
long time = BitConverter.ToInt64(Convert.FromBase64String(toUnpack),0);
return Jan1st1970.AddSeconds(time); //you may or may not want a "ToLocaltime()" call here.
}

请注意,所有这些都是在没有 IDE 的帮助下完成的 - 上面可能有一两个错误。但它应该让你开始。

这应该会产生一个固定宽度的字符串。由于我们只计算秒而不是毫秒,您可能会发现结果中总是有一些不需要的额外填充。您甚至可以使用 int 而不是 long,这会将字符串切成两半。但是,请小心去除该填充,因为越接近 1970 年,数字越小,但越远则越大,您就越有可能需要它。您需要确保您的日期值适合进行任何修剪的新的、较小的范围。例如,当前日期很适合在 int 中,但即使是 28 年后也不会。 UInt32 将使您更深入地了解 future ,但会阻止您使用 1970 年之前的日期。

关于datetime - YYYYMMDDHHMMSS 的最紧字节表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7362174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com