使用時間戳生成唯一主鍵

  • 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;