2015-06-12 130 views
1

我需要根據日期生成增量編號。 前一天創建的數字(比如說2014年1月6日)應該不會超過即將到來的日期創建的數字(比如2014年1月8日)。 如何添加日期? 我嘗試了下一個,但在少數情況下,它是失敗根據日期和自動增量編號創建一個唯一編號

失敗的情況下

傳遞日期:2014年6月6日 人數:14 編號創建:14060614

日期通過:2013-06-06 編號:132 創建人數:130606132(大於14060614)

該功能可以被多個應用程序同時調用。所以DATETIME(甚至毫秒)可以同任何 解決這個問題

+0

我不明白。爲什麼不檢查'日期'是否小於'08-Jan-2014'? –

+0

@SonerGönül:那個日期只是一個例子,我的錯誤。編輯 –

+0

使用'DateTime.Now.Ticks'有什麼問題? – Niklas

回答

2

這個問題似乎是你的運行編號(alwaysincrementeduniquenumber)的變化範圍從1到1000,當你做一個字符串連接決賽號碼將具有更少或更多的數字。

你可以做類似

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

假設你不產生超過K記錄每天,這應該保證你不會有這個問題。

+0

我不明白它將如何獨特?因此對於同一日期,會有多次調用GetUniqueNumberAsPerDate()方法。甚至毫秒可以是相同的。所以數字不會是唯一的。請糾正,如果我錯了 –

+0

糟糕:沒有完成:)你自己的例子是130606132與14060614,這個問題與毫秒無關,但運行的數字部分分別爲132和14.由於你使用字符串連接,這會產生一個數字分別爲9位和8位。然後,2013年的數字最大。使用我的方法,你會得到130606000132和140606000014這將測試確定。 – faester

+0

重點在於,您必須強制日期部分成爲生產編號中最重要的部分。 – faester

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

     return long.Parse(uniqueNumber); 
    } 

我認爲這應該工作,它首先將日期轉換成十進制數,然後muliplied擺脫小數,然後遞增數量在前面作爲一個字符串只是增加。

你可以關掉這個aregment(日期數第一),使日數將永遠是在以後的日子

+0

它將如何獨特?對於相同的datestr(具有相同的毫秒),它將返回重複的結果 –

+1

是不是你使用你的增量編號呢? alwaysIncrementeduniqueNum應該在每次調用這個函數時增加 – Vajura

+0

讓我試一次 –

1

我需要生成基於日期增量的數字更大。在以前的日期創建的數字不應該大於在即將到來的日期創建的數字。

根據這個要求,你可以簡單地採取

date.Ticks 

它提供了許多嚴格與DateTime增加。

如果你想避免在同一蜱數量相等,則可以添加

Thread.Sleep(16); 

Windows的定時器中斷蜱在64赫茲。 然而,這意味着你不能每秒產生超過64個值。

+1

它可以產生重複的值 – dotctor

+1

是的,對於在完全相同刻度(20ms AFAIR)下拍攝的兩個日期,但他沒有提及這是禁止的。 – 3dGrabber

+0

如果你把它鎖定在一個線程中並讓它在短時間內休眠,它應該可以工作,對吧? – Niklas

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當你需要新的號碼。通過使用這個類,即使您的應用程序有多個實例在運行,或者即使您的應用程序重新啓動,您也可以獲得增量編號。