有一些需求需要設置某地址的訪問失效時間,例如生成地址之后30分鍾之內可以訪問,30分鍾之后就不允許訪問。此時需要在生成地址時加入當前時間戳,在用戶訪問該地址時獲取地址中的時間戳和系統當前的時間做比較,即可得出是否允許訪問的權限。
例如:地址生成時加入時間戳字段time=20191127121314,用戶訪問時獲取到time字段的值,得到毫秒值,再加上30分鍾對應的毫秒值即:30*60*1000=1800000,得到該地址可以訪問的最大時間的毫秒值timeMax,然后再獲取系統當前的毫秒值timeNow和timeMax進行比較,若timeMax<timeNow則說明該地址已經失效。
錯誤代碼:
1 String time = "20191127121314"; 2 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss"); 3 long millionSeconds = sdf.parse(time).getTime();//毫秒 4 long timeMax= millionSeconds + 1800000; 5 long timeNow = new Date().getTime(); 6 if(timeMax< timeNow){
System.out.println("timeMax======"+timeMax+";timeNow======="+timeNow+";校驗失敗,超時!"); 7 }
以上代碼用了幾天沒有什么問題,但是偶爾有一次在中午12點多的時候生成地址去訪問發現超時了,看了系統時間和地址中的時間戳都沒有問題。自己在本地驗證了一下,20191127121314 對應的毫秒值是--1574784794000,而系統的當前毫秒值是:1574830678691,這兩個毫秒值之間相差了12個多小時,最后發現是時間格式的原因,yyyyMMddhhmmss中應該是HH,hh-12小時制(1-12),HH-24小時制(0-23),修改之后驗證沒有問題。
正確代碼:
1 String time = "20191127121314"; 2 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); 3 long millionSeconds = sdf.parse(time).getTime();//毫秒 4 long timeMax= millionSeconds + 1800000; 5 long timeNow = new Date().getTime(); 6 if(timeMax< timeNow){ 7 System.out.println("timeMax======"+timeMax+";timeNow======="+timeNow+";校驗失敗,超時!"); 8 }
(轉)Java 實例 - 時間戳轉換成時間
以下實例演示了如何使用 SimpleDateFormat 類的 format() 方法將時間戳轉換成時間。
日期和時間模式(注意大小寫,代表的含義是不同的):
- yyyy:年
- MM:月
- dd:日
- hh:1~12小時制(1-12)
- HH:24小時制(0-23)
- mm:分
- ss:秒
- S:毫秒
- E:星期幾
- D:一年中的第幾天
- F:一月中的第幾個星期(會把這個月總共過的天數除以7)
- w:一年中的第幾個星期
- W:一月中的第幾星期(會根據實際情況來算)
- a:上下午標識
- k:和HH差不多,表示一天24小時制(1-24)
- K:和hh差不多,表示一天12小時制(0-11)
- z:表示時區
Main.java 文件
1 import java.text.SimpleDateFormat; 2 import java.util.Date; 3 4 public class Main{ 5 public static void main(String[] args){ 6 Long timeStamp = System.currentTimeMillis(); //獲取當前時間戳 7 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 8 String sd = sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp)))); // 時間戳轉換成時間 9 System.out.println("格式化結果:" + sd); 10 11 SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 時 mm 分 ss 秒"); 12 String sd2 = sdf2.format(new Date(Long.parseLong(String.valueOf(timeStamp)))); 13 System.out.println("格式化結果:" + sd2); 14 } 15 }
以上代碼運行輸出結果為:
格式化結果:2018-07-10 12:17:34 格式化結果:2018 年 07 月 10 日 12 時 17 分 34 秒
參考文檔:https://www.runoob.com/java/date-timestamp2date.html