根据日期和自动递增的数字创建一个唯一的数字
Create a unique number based on date and autoincremented number
我需要根据日期生成增量数字。
在前一个日期(比如 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)
该函数可以被多个应用程序同时调用。所以日期时间(甚至毫秒)可以相同
这个问题的任何解决方案
问题似乎是您的 运行 数字(总是递增的唯一数字)在 1 到 1000 的范围内变化。当您进行字符串连接时,最终数字将有更少或更多的数字。
你可以做类似
const long k = 1000000;
long value = long.Parse(dateStr) * k + alwaysIncrementeduniqueNum;
假设你每天不产生超过K
条记录,这应该保证你没有这个问题。
public long GetUniqueNumberAsPerDate(DateTime date)
{
double dateStr = date.ToOADate();
dateStr *= 1000000;
long alwaysIncrementeduniqueNum = num + 1;
string uniqueNumber = alwaysIncrementeduniqueNum + " " + dateStr;
return long.Parse(uniqueNumber);
}
我认为这应该可行,它首先将日期转换为十进制数,然后乘以去掉小数点,然后将递增的数字作为字符串添加到前面。
您可以切换此段(日期编号在前),以便以后的日期编号总是更大
I need to generate the incremental numbers based on date. numbers created on a previous date should not be greater then numbers created on the coming dates.
按照这个要求你可以直接拿
date.Ticks
它提供了一个严格随 DateTime
递增的数字。
如果你想避免在同一个刻度上出现相同的数字,你可以添加
Thread.Sleep(16);
Windows' 定时器中断以 64 Hz 的频率滴答。
然而,这意味着您每秒不能生成超过 64 个值。
如果你想在机器上增加数字,你可以使用这个class
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
。通过使用此 class,即使您有多个应用程序实例 运行 或者即使您的应用程序重新启动,您也可以获得增量编号。
我需要根据日期生成增量数字。 在前一个日期(比如 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)
该函数可以被多个应用程序同时调用。所以日期时间(甚至毫秒)可以相同 这个问题的任何解决方案
问题似乎是您的 运行 数字(总是递增的唯一数字)在 1 到 1000 的范围内变化。当您进行字符串连接时,最终数字将有更少或更多的数字。
你可以做类似
const long k = 1000000;
long value = long.Parse(dateStr) * k + alwaysIncrementeduniqueNum;
假设你每天不产生超过K
条记录,这应该保证你没有这个问题。
public long GetUniqueNumberAsPerDate(DateTime date)
{
double dateStr = date.ToOADate();
dateStr *= 1000000;
long alwaysIncrementeduniqueNum = num + 1;
string uniqueNumber = alwaysIncrementeduniqueNum + " " + dateStr;
return long.Parse(uniqueNumber);
}
我认为这应该可行,它首先将日期转换为十进制数,然后乘以去掉小数点,然后将递增的数字作为字符串添加到前面。
您可以切换此段(日期编号在前),以便以后的日期编号总是更大
I need to generate the incremental numbers based on date. numbers created on a previous date should not be greater then numbers created on the coming dates.
按照这个要求你可以直接拿
date.Ticks
它提供了一个严格随 DateTime
递增的数字。
如果你想避免在同一个刻度上出现相同的数字,你可以添加
Thread.Sleep(16);
Windows' 定时器中断以 64 Hz 的频率滴答。 然而,这意味着您每秒不能生成超过 64 个值。
如果你想在机器上增加数字,你可以使用这个class
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
。通过使用此 class,即使您有多个应用程序实例 运行 或者即使您的应用程序重新启动,您也可以获得增量编号。