C#生成订单号类与反向获取订单号的日期

C#生成订单号类与反向获取订单号的日期

C#生成订单号类与反向获取订单号的日期

/// <summary>
/// 生成订单号类
/// </summary>
public class OrderForm
{
private static long np1 = 0, np2 = 0, np3 = 1; //临时计算用。
private static object orderFormNumberLock = new object();//线程并行锁,以保证同一时间点只有一个用户能够操作流水号。如果分多个流水号段,放多个锁,并行压力可以更好的解决,大家自己想法子扩充吧

/// <summary>
/// 初始化订单号码
/// 编码规则:(16进制,从DateTime.MinValue起到此时的)总天数 + 今天的总秒数 + 当前秒内产生的订单序号,其中今天的订单序号每秒清零。
/// 该方法线程安全。
/// </summary>
public static string CreateOrderNumber()
{
DateTime now = DateTime.Now;
TimeSpan span = now - DateTime.MinValue;
long tmpDays = span.Days;
long seconds = span.Hours * 3600 + span.Minutes * 60 + span.Seconds;
StringBuilder sb = new StringBuilder();
Monitor.Enter(orderFormNumberLock); //锁定资源
if (tmpDays != np1)
{
np1 = tmpDays;
np2 = 0;
np3 = 1;
}
if (np2 != seconds)
{
np2 = seconds;
np3 = 1;
}
sb.Append(Convert.ToString(np1, 10).PadLeft(6, '0') + Convert.ToString(np2, 10).PadLeft(5, '0') + Convert.ToString(np3++, 10));
Monitor.Exit(orderFormNumberLock); //释放资源
return sb.ToString();
}

/// <summary>
/// 获取订单号表示的日期
/// 即:反向获取订单号的日期
/// </summary>
public static DateTime GetDateTimeFromOrderNumber(string orderNumber)
{
if (!string.IsNullOrEmpty(orderNumber))
{
return DateTime.MinValue.AddDays(Convert.ToInt64(orderNumber.Substring(0, 6), 10)).AddSeconds(Convert.ToInt64(orderNumber.Substring(6, 5), 10));
}
else
{
return DateTime.MinValue;
}
}
}

本文由 魏代群个人博客 作者:weidaiqun 发表,其版权均为 魏代群个人博客 所有,文章内容系作者个人观点,不代表 魏代群个人博客 对观点赞同或支持。如需转载,请注明文章来源。
7

评论:

1 条评论,访客:1 条,站长:0 条

0%好评

  • 好评:(0%)
  • 中评:(100%)
  • 差评:(0%)

最新评论

发表评论