使用時間戳生成唯一主鍵
- 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;