• 时间戳校验问题


      有一些需求需要设置某地址的访问失效时间,例如生成地址之后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 实例 - 时间戳转换成时间

    Java 实例 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

  • 相关阅读:
    使用IIS实现反向代理
    C#管理windows服务
    使用SoapUI测试windows身份验证的webservice
    SQLSERVER2014集群实战——IP引发的坑
    (复活公告??)
    各种trick和细节错误汇总
    emacs常用指令
    随机数据生成与对拍【c++版,良心讲解】
    UVA11019 Matrix Matcher
    HDU4757 Tree
  • 原文地址:https://www.cnblogs.com/shiyunli/p/11943369.html
Copyright © 2020-2023  润新知