java生成指定范围的随机日期

 更新时间:2017年12月01日 09:49:41   作者:乔巴大大  
这篇文章主要为大家详细介绍了java生成指定范围的随机日期,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

有这样一个需求:构造一个方法,随机生成1990-12-31 00:00 00到 2013-12-31 00:00:00之间任意一个时间点。
思路是这样:在javaAPI中 Date类型和long类型很好转化,所以我们可以把问题转化为,求两个long类型数之间的任意值。
同时需要了解java API中的:Math.round(double)  Math.random();  new Date(year,month,day); Calendar。

Math.random() 会随机生成大于等于0小于1的随机的double类型。

Math.round(double ) 需要传入一个double类型,返回最接近这个double类型的long类型。

Calendar 是处理时间的工具类,如Date一样Calendar的月份也是从0开始计算

具体代码如下

public static String randomDateBetweenMinAndMax(){ 
    Calendar calendar = Calendar.getInstance(); 
    //注意月份要减去1 
    calendar.set(1990,11,31); 
    calendar.getTime().getTime(); 
    //根据需求,这里要将时分秒设置为0 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.SECOND,0); 
    long min = calendar.getTime().getTime();; 
    calendar.set(2013,11,31); 
    calendar.set(Calendar.HOUR_OF_DAY,0); 
    calendar.set(Calendar.MINUTE,0); 
    calendar.set(Calendar.SECOND,0); 
    calendar.getTime().getTime(); 
    long max = calendar.getTime().getTime(); 
    //得到大于等于min小于max的double值 
    double randomDate = Math.random()*(max-min)+min; 
    //将double值舍入为整数,转化成long类型 
    calendar.setTimeInMillis(Math.round(randomDate)); 
    return calendar.getTime().toString(); 
  } 

如果要用Date类处理时间,需要注意,年是从1900开始计算所以要减去1900,月是从0开始计算所以要减去1,比如 new Date(2013,10,10) 得到的date对象表示的时间是3913年11月10日。

System.out.println(new Date(2013,10,10)); 

结果是:Mon Nov 10 00:00:00 CST 3913

把上面的问题稍微变一下,已知minDate和maxDate,要求把这个时间区间的每一天放入list。

public static void getDateBetweenMaxAndMin(){ 
    List<Date> list = new ArrayList<Date>(); 
    Calendar calendar = Calendar.getInstance(); 
    calendar.set(2010,10,10); 
    Date minDate = calendar.getTime(); //最小时间 
    calendar.set(2013,11,1); 
    Date maxDate = calendar.getTime();//最大时间 
    //计算两个时间点相隔多少天 
    int totalDays = Ints.checkedCast((maxDate.getTime() - minDate.getTime()) / (1000 * 60 * 60 * 24)); 
    calendar.setTime(minDate); 
    calendar.set(Calendar.HOUR_OF_DAY,0); 
    calendar.set(Calendar.MINUTE,0); 
    calendar.set(Calendar.SECOND,0); 
    for(int i = 0;i<=totalDays;i++){ 
      if(i!=0){ 
        //天数加1 
        calendar.add(Calendar.DAY_OF_MONTH,1); 
      } 
      list.add(calendar.getTime()); 
    } 
  } 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java countDownLatch如何实现多线程任务阻塞等待

    Java countDownLatch如何实现多线程任务阻塞等待

    这篇文章主要介绍了Java countDownLatch如何实现多线程任务阻塞等待,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • java SSLContext创建方式

    java SSLContext创建方式

    这篇文章主要介绍了java SSLContext创建方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java实现归并排序的示例代码

    Java实现归并排序的示例代码

    归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。本文将用Java实现这一排序,需要的可以参考一下
    2022-08-08
  • 利用Spring Cloud Config结合Bus实现分布式配置中心的步骤

    利用Spring Cloud Config结合Bus实现分布式配置中心的步骤

    这篇文章主要介绍了利用Spring Cloud Config结合Bus实现分布式配置中心的相关资料,文中通过示例代码将实现的步骤一步步介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友下面来一起看看吧
    2018-05-05
  • java虚拟机之JVM调优详解

    java虚拟机之JVM调优详解

    这篇文章主要介绍了java虚拟机之JVM调优详解,文中有非常详细的代码示例,对正在学习Java虚拟机的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Java小白第一次就能看懂的网络编程

    Java小白第一次就能看懂的网络编程

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。本文介绍了一些网络编程基础的概念,并用Java来实现TCP和UDP的Socket的编程,来让读者更好的了解其原理
    2021-08-08
  • @Autowired注入为null的原因与解决方法

    @Autowired注入为null的原因与解决方法

    我们经常会通过@Autowired注解将某个类注到另一个类中,但是会发现注不进去,报NULL,所以本文就给大家分析了@Autowired 注入为null 的原因与解决方法,需要的朋友可以参考下
    2023-09-09
  • GraalVM系列Native Image Basics静态分析

    GraalVM系列Native Image Basics静态分析

    这篇文章主要为大家介绍了GraalVM系列Native Image Basics静态分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • JavaWeb Servlet技术及其应用实践

    JavaWeb Servlet技术及其应用实践

    这篇文章主要介绍了JavaWeb Servlet技术,Servlet指在服务器端执行的一段Java代码,可以接收用户的请求和返回给用户响应结果,感兴趣想要详细了解可以参考下文
    2023-05-05
  • 解决mapper.xml中resultType映射类型的问题

    解决mapper.xml中resultType映射类型的问题

    这篇文章主要介绍了解决mapper.xml中resultType映射类型的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06

最新评论