使用时间戳生成唯一主键
- 2019 年 12 月 4 日
- 筆記
之前在开发一个功能模块的时候遇到了JS的时间存为时间戳的情况,因为头一次遇到折腾了好久。而在开发另一个某款需要存储数据时,我想到时间戳精确到毫秒的特性,正好适合作为作为主键ID来使用,在绝大部分系统中,毫秒级的使用范围应该都是符合的。
先说下什么是时间戳
时间戳(timestamp),一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。使用数字签名技术产生的数据, 签名的对象包括了原始文件信息、 签名参数、 签名时间等信息。广泛的运用在知识产权保护、 合同签字、 金融帐务、 电子报价投标、 股票交易等方面。
在开发中,有两种时间戳,一种是JS时间戳,另一种则是Unix时间戳。
JS时间戳与Unix时间戳
首先要清楚JavaScript与Unix的时间戳的区别:
JavaScript时间戳:是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。
Unix时间戳:是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
可以看出JavaScript时间戳总毫秒数,Unix时间戳是总秒数。
比如同样是的 2016/11/03 12:30:00 ,转换为JavaScript时间戳为 1478147400000;转换为Unix时间戳为 1478147400。
因此使用Js的时间戳来拼接生成主键Id 无疑是一种很好的选择。
C# DateTime转换为JavaScript时间戳
DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); // 当地时区 long timeStamp = (long)(DateTime.Now - startTime).TotalMilliseconds; // 相差毫秒数 Console.WriteLine(timeStamp);
JavaScript时间戳转换为C# DateTime
long jsTimeStamp = 1478169023479; DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区 DateTime dt = startTime.AddMilliseconds(jsTimeStamp); Console.WriteLine(dt.ToString("yyyy/MM/dd HH:mm:ss:ffff"));
主键示例
下述示例,使用字符串开头 + 用户名称 + 时间戳来创建 主键 Id, 同一毫秒内几乎不可能有来自同一用户的创建请求。
//时间戳方式创建N_ID DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); // 当地时区 long timeStamp = (long)(notice.PUB_TIME - startTime).TotalMilliseconds; // 相差毫秒数 //添加唯一ID notice.N_ID = "No-" + notice.PUB_BY + timeStamp;