一、時間戳概述
時間戳是計算機表示時間的一種方法,具體而言,它是一個能夠唯一標識某一時刻的數字,以秒為單位,從1970年1月1日0時0分0秒開始累計,即所謂的Unix時間戳。這個時間點也稱為UNIX元年或UNIX紀元(Unix Epoch)。
時間戳13位則是在標準時間戳的基礎上擴展而來,精度更高,能夠精確到毫秒級,即1秒後面加上三個0。時間戳13位的表達形式是一個13位的整數,用於表達從1970年1月1日0時0分0秒起至今的毫秒數,值得注意的是,由於13位整數的表示範圍太大,需要使用64位整數來存儲,因此在一些編程語言中需要用到專門的類型表示13位時間戳。
二、時間戳的意義
時間戳13位在計算機系統中具有非常廣泛的應用,主要包括以下幾個方面:
1、在互聯網應用中,時間戳可以唯一標識某一次請求或者操作,幫助進行服務器端的日誌跟蹤和統計工作。
2、在計算機程序中,時間戳可以用於對不同結果或者狀態進行排序,從而方便進行後續的處理。
3、在計算機操作系統中,時間戳可以作為文件或者目錄的修改時間或者創建時間,從而實現文件管理。
4、在各種開發框架中,時間戳也是一種非常常用的時間表示方式,比如在Java中可以使用java.util.Date和java.sql.Timestamp來表示時間戳,而在Python中可以使用time模塊進行時間戳的轉換和計算。
三、時間戳的轉換
時間戳13位與日期時間之間可以進行相互轉換,常用的方式包括以下幾個方面:
1、通過編程語言進行轉換
//Java示例代碼 long timeStamp13 = 1623751710000L; Date date= new Date(timeStamp13); System.out.println(date); //Python示例代碼 import time timeStamp13 = 1623751710000 dateArray = time.localtime(timeStamp13/1000) print(time.strftime("%Y-%m-%d %H:%M:%S", dateArray))
2、通過在線工具進行轉換
國內的時間戳在線轉換工具比較多,可使用百度搜索「時間戳轉換」即可找到多種免費的在線轉換工具。
3、使用Linux命令行進行轉換
在Linux命令行中,可以使用date命令進行時間戳與日期時間之間的轉換。
$ date -d @1623751710 +%Y-%m-%d\ %H:%M:%S 2021-06-15 16:48:30
四、時間戳的應用實例
1、使用時間戳生成唯一ID
在分佈式系統中,需要生成一個全局唯一的ID來標識每一條記錄,通常可以使用時間戳作為ID的一部分,以保證每個ID的唯一性。
//Java示例代碼 public class UniqueIdGenerator { private static final int SEQUENCE_BITS = 12; private static final int MACHINE_ID_BITS = 5; private static final int TIMESTAMP_BITS = 41; private static final long MAX_SEQUENCE = (1L << SEQUENCE_BITS) - 1; private static final long MAX_MACHINE_ID = (1L << MACHINE_ID_BITS) - 1; private static final long MACHINE_ID = 0; private long sequence = 0L; private long lastTimestamp = -1L; public synchronized long nextId() { long currentTimestamp = System.currentTimeMillis(); if(currentTimestamp < lastTimestamp) { throw new RuntimeException("Clock moved backwards"); } if(lastTimestamp == currentTimestamp) { sequence = (sequence + 1) & MAX_SEQUENCE; if(sequence == 0) { currentTimestamp = waitUntilNextTimestamp(lastTimestamp); } } else { sequence = 0; } lastTimestamp = currentTimestamp; return (currentTimestamp << (SEQUENCE_BITS + MACHINE_ID_BITS)) | (MACHINE_ID << SEQUENCE_BITS) | sequence; } private long waitUntilNextTimestamp(long lastTimestamp) { long timestamp = System.currentTimeMillis(); while(timestamp <= lastTimestamp) { timestamp = System.currentTimeMillis(); } return timestamp; } } UniqueIdGenerator generator = new UniqueIdGenerator(); long id = generator.nextId();
2、使用時間戳實現程序計時
在程序開發中,需要經常測量某個操作的時間執行時長,常用的方式是使用時間戳記錄開始時間和結束時間,然後計算時間差即可。
//Java示例代碼 long startTime = System.currentTimeMillis(); doSomething(); long endTime = System.currentTimeMillis(); long elapsedTime = endTime - startTime; System.out.println("Elapsed time: " + elapsedTime + "ms"); //Python示例代碼 import time start_time = time.time() do_something() end_time = time.time() elapsed_time = end_time - start_time print("Elapsed time: {}s".format(elapsed_time))
3、使用時間戳實現緩存過期機制
在緩存系統中,需要設定某個緩存對象的過期時間,常用的方式也是記錄緩存對象的過期時間戳,然後檢查當前時間戳是否超過緩存過期時間戳,如果超過則需要重新加載緩存對象。
//Java示例代碼 Map cache = new ConcurrentHashMap(); long expireTime = System.currentTimeMillis() + 3600 * 1000; //過期時間為1小時 Object value = getFromCache(key); if(value == null || System.currentTimeMillis() >= expireTime) { value = loadFromDatabase(key); cache.put(key, value); } //Python示例代碼 import time cache = {} expire_time = time.time() + 3600 #過期時間為1小時 value = get_from_cache(key) if value is None or time.time() >= expire_time: value = load_from_database(key) cache[key] = value
4、使用時間戳實現API調用頻率限制
在Web API開發中,需要限制某些API接口的調用頻率,通常的方式是記錄API接口調用的時間戳,並且限制一定時間間隔內只能調用一定次數的API接口。
//Java示例代碼 Map apiCallRecords = new ConcurrentHashMap(); long timeWindow = 60 * 1000; //限制調用頻率為1分鐘內不超過10次 int apiCallLimit = 10; String apiPath = "/api/v1"; String remoteAddr = getRemoteAddr(); String key = remoteAddr + apiPath; long currentTimestamp = System.currentTimeMillis(); long earliestValidTimestamp = currentTimestamp - timeWindow; Long earliestRecordTimestamp = apiCallRecords.putIfAbsent(key, currentTimestamp); if(earliestRecordTimestamp != null && earliestRecordTimestamp = earliestValidTimestamp) { apiCallTimes++; } } if(apiCallTimes > apiCallLimit) { throw new RuntimeException("API call frequency exceed limit"); } //Python示例代碼 import time api_call_records = {} time_window = 60 #限制調用頻率為1分鐘內不超過10次 api_call_limit = 10 api_path = "/api/v1" remote_addr = get_remote_addr() key = remote_addr + api_path current_timestamp = time.time() earliest_valid_timestamp = current_timestamp - time_window if key in api_call_records: earliest_record_timestamp = api_call_records[key] if earliest_record_timestamp = earliest_valid_timestamp]) if api_call_times > api_call_limit: raise Exception("API call frequency exceed limit")
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/198526.html