根据日期和自动增量编号创建唯一编号

时间:2015-06-12 08:09:51

标签: c# .net uniqueidentifier

我需要根据日期生成增量数字。 在之前的日期(例如2014年1月6日)创建的数字不应该大于在即将到来的日期创建的数字(例如2014年1月8日)。 如何添加日期? 我试了一下,但在少数情况下它失败了

static long num =1;
public long GetUniqueNumberAsPerDate(DateTime date)
{
    string dateStr = date.ToString("yyMMdd");
    long alwaysIncrementeduniqueNum = num + 1;

    return Convert.Int64(dateStr + alwaysIncrementeduniqueNum.ToString());
}

失败案例

日期:2014-06-06 数字:14 编号:14060614

传递日期:2013-06-06 数字:132 编号:130606132(大于14060614)

该功能可以由多个应用程序同时调用。所以dateTime(偶数毫秒)可以是相同的 解决这个问题的任何方法

4 个答案:

答案 0 :(得分:2)

问题似乎是你的运行号码(alwaysincrementeduniquenumber)在1到1000的范围内变化。当你进行字符串连接时,最终的数字会有更少或更多的数字。

您可以执行类似

的操作
   const long k = 1000000;
   long value = long.Parse(dateStr) * k + alwaysIncrementeduniqueNum; 

假设您每天产生的记录不超过K,这应该可以保证您没有此问题。

答案 1 :(得分:1)

    public long GetUniqueNumberAsPerDate(DateTime date)
    {
        double dateStr = date.ToOADate();
        dateStr *= 1000000;
        long alwaysIncrementeduniqueNum = num + 1;
        string uniqueNumber = alwaysIncrementeduniqueNum + " " + dateStr;

        return long.Parse(uniqueNumber);
    }

我认为这应该有用,它首先将日期转换为十进制数,然后将其多处除去小数,然后将增量数字作为字符串添加到前面。

您可以切换此段(日期编号优先),以便日期编号在以后总是更大

答案 2 :(得分:1)

  

我需要根据日期生成增量数字。在前一个日期创建的数字不应大于在即将到来的日期创建的数字。

根据这个要求,你可以简单地采取

date.Ticks

它提供的数字与DateTime严格增加。

如果您想避免在同一刻度上使用相同的数字,可以添加

Thread.Sleep(16);

视窗'定时器中断以64 Hz为单位。 但是,这意味着您每秒不能生成超过64个值。

答案 3 :(得分:1)

如果您想在机器上使用增量编号,可以使用此类

public class IncrementalNumberGenerator
{
    private readonly string _path;
    private readonly EventWaitHandle _waitHandle; 

    public IncrementalNumberGenerator(string path)
    {
        _path = path;
        _waitHandle =  new EventWaitHandle(true, EventResetMode.AutoReset, Guid.NewGuid().ToString("N"));
        if (!File.Exists(_path))
            File.WriteAllText(_path,"0");
    }

    public ulong Next()
    {
        try
        {
            _waitHandle.WaitOne();
            var currentValue = ulong.Parse(File.ReadAllText(_path));
            File.WriteAllText(_path, (currentValue + 1).ToString());
            return currentValue + 1;
        }
        finally
        {
            _waitHandle.Set();
        }
    }
}

这将使用命名等待句柄来同步不同的线程和进程。

一样使用它
var ing = new IncrementalNumberGenerator(@"c:\data\temp\synch");

并在需要新号码时致电Next。通过使用此类,即使您的应用程序的多个实例正在运行,或者即使您的应用程序重新启动,也可以获得增量编号。