如何从DateTime生成GUID?

时间:2018-09-18 15:38:06

标签: c# datetime

我想从DateTime生成Guid v.1。我尝试使用此处描述的类:

  

https://gist.github.com/nberardi/3759706

但是从DateTime获得Guid之后,我尝试使用该Guid来获得与原始广告相同的DateTime,这给了我一个不同的{{ 1}}。这是我使用的代码:

Guid

如何从 string uuidString = "9e5713bb-bb4c-11e8-9d6c-12345678df23"; Guid gui = new Guid(uuidString); DateTime dateTimeFromGuid = GuidGenerator.GetDateTime(gui); Console.WriteLine(dateTimeFromGuid.ToString("dd/MM/yyyy hh:mm:ss")); Guid guidFromDateTime = GuidGenerator.GenerateTimeBasedGuid(dateTimeFromGuid); Console.WriteLine(guidFromDateTime); //7909dbbb-bb33-11e8-9f6a-95d8e90ccf10 取回原始GUID?

2 个答案:

答案 0 :(得分:1)

如果您想要简单的东西,无论您使用什么机器,都可以来回转换。然后,您可以将日期转换为字节数组,并使用该日期创建Guid。这是非标准的,但会为每个Guid生成完全相同的DateTime

var today = new DateTime(2018, 9, 18, 10, 59, 00);

var bytes = BitConverter.GetBytes(today.Ticks);

Array.Resize(ref bytes, 16);

var guid = new Guid(bytes);

Console.WriteLine(guid); //bd02b200-1d55-08d6-0000-000000000000

并追溯到过去。

var dateBytes = guid.ToByteArray();

Array.Resize(ref dateBytes, 8);

var date = new DateTime(BitConverter.ToInt64(dateBytes));

Console.WriteLine(date); //9/18/2018 10:59:00

如果您想使用扩展名。

class Program
{
    static void Main(string[] args)
    {
        var date = new DateTime(2018, 09, 18, 12, 00, 00);

        var guid = date.ToGuid();

        Console.WriteLine(guid); // 428a6000-1d5e-08d6-0000-000000000000

        var back2date = guid.ToDateTime();

        Console.WriteLine(back2date); // 9/18/2018 12:00:00
    }
}

public static class DateTimeExtensions
{
    public static Guid ToGuid(this DateTime dt)
    {
        var bytes = BitConverter.GetBytes(dt.Ticks);

        Array.Resize(ref bytes, 16);

        return new Guid(bytes);
    }
}

public static class GuidExtensions
{
    public static DateTime ToDateTime(this Guid guid)
    {
        var bytes = guid.ToByteArray();

        Array.Resize(ref bytes, 8);

        return new DateTime(BitConverter.ToInt64(bytes));
    }
}

答案 1 :(得分:1)

如果目标是获得可复制的GUID,则需要禁用随机组件。这些在程序启动时设置。此后它们不再更改,因此生成的GUID从那时起就保持稳定,但是程序的每次运行将使用不同的随机值,因此每次运行将为已知的日期时间值提供不同的半随机GUID。

要禁用它,只需执行以下操作:

//var random = new Random();
//random.NextBytes(DefaultClockSequence);
//random.NextBytes(DefaultNode);

此外,在本地运行时,您必须强制DateTime值使用UTC,我这样做如下:

DateTime dateTimeFromGuid = GuidGenerator.GetDateTime(gui);
dateTimeFromGuid = new DateTime(dateTimeFromGuid.Ticks, DateTimeKind.Utc);

最好将此“ UTC修复程序”移至库代码中。

提琴(我还将输入GUID更改为“非随机”值):
https://dotnetfiddle.net/niIHlz