我需要根据日期生成增量数字。 在之前的日期(例如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(偶数毫秒)可以是相同的 解决这个问题的任何方法
答案 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
。通过使用此类,即使您的应用程序的多个实例正在运行,或者即使您的应用程序重新启动,也可以获得增量编号。