Java中常见时间类的使用

模拟场景
针对于常用的操作API,比如流操作(字符流、字节流),时间操作等,仅仅了解概念性的定义终究是无法了解该类的用途和使用方式;这种情况在使用的时候便一脸茫然,脑海中映射不到对应的知识点。
本篇博客将通过一个简单的应用场景来体会这两个类的使用。

项目开发阶段,有一个关于下单发货的需求:
如果今天下午三点前进行下单,那么发货时间是明天
如果今天下午三点后机型下单,那么发货时间是后天
如果被确定的发货时间是周日的话,那么在此时间上再加一天为最终发货时间

牛刀小试( java 原始)
整体逻辑:主函数创建下单时间,调用函数进行逻辑判断,返回最终的发货时间。
整理代码如下(主函数不在列举):

private static Date sendDateTime(String orderTime) throws ParseException {
/**
* 1:
* 1.1:实例化一个date为今天下午三点
* 2:判断date是否大于今天下午三点,定义一个发货时间
* 2.1:如果不大于的话,则发货时间是明天
* 2.2:如果大于的话,则发货时间是后天
* 3:判断发货时间是否是周日,
* 3.1:如果不大于的话,则发货时间不变
* 3.2:如果大于的话,则发货时间再加一天
*
*/
// 获取订单时间
DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date orderDateTime = format.parse(orderTime);

// 获取今天下午三点,这里计算有问题
Calendar equalInstance = Calendar.getInstance();
equalInstance.set(Calendar.HOUR_OF_DAY,15);
equalInstance.set(Calendar.MINUTE, 0);
equalInstance.set(Calendar.SECOND, 0);
Date orderEqualTime = equalInstance.getTime();

// 创建预下单时间
Calendar calendar = Calendar.getInstance();
calendar.setTime(orderDateTime);

// 判断订单时间是否大于今天下午三点
boolean isMoreThan = orderDateTime.after(orderEqualTime);
if(isMoreThan){
//    发货时间是后天(订单时间加两天)
calendar.add(Calendar.DATE,2);
}else{
//    发货时间是明天(订单时间加一天)
calendar.add(Calendar.DATE,1);
}
Date preShipTime = calendar.getTime();
return skipTime(preShipTime);
}
private static Date skipTime(Date date){
Calendar instance = Calendar.getInstance();
instance.setTime(date);
// 外国的习俗是周末是一周的第一天,在java8以及JodaTime中已经恢复成正常的周末顺序
int preWeekDay = instance.get(Calendar.DAY_OF_WEEK);
// 因为是今天,所以我拿周二来判断,而不是周日
if(preWeekDay==Calendar.SUNDAY){
instance.add(Calendar.DATE,1);
}
return instance.getTime();
}
    private static DateTime calculateTime(String orderTime) {
        // 获取当前订单时间
        DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
        DateTime orderDateTime = dateTimeFormatter.parseDateTime(orderTime);
        // 创建今天下午三点的时间
        DateTime orderEqualTime = orderDateTime.withHourOfDay(15).withMinuteOfHour(0).withSecondOfMinute(0);
        // DateTime orderEqualTime = new DateTime(2019, 11, 10, 15, 0, 0, 0);

        // 创建预发货时间
        DateTime preSkipDateTime=orderEqualTime.isAfter(orderDateTime)?orderDateTime.plusDays(1):orderDateTime.plusDays(2);

        return isTuesday(preSkipDateTime);
    }

    private static DateTime isTuesday(DateTime preSkipDateTime) {
        // 获取预发货时间位于星期几
        int dayOfWeek = preSkipDateTime.getDayOfWeek();
        return (dayOfWeek != DateTimeConstants.SUNDAY) ? preSkipDateTime : preSkipDateTime.plusDays(1);
    }
版本升级(java 8)
private static LocalDateTime calculateTime(String orderTime){
/**
* 1:将字符串转变为date
* 1.1:实例化一个date为今天下午三点
* 2:判断date是否大于今天下午三点,定义一个发货时间
* 2.1:如果不大于的话,则发货时间是明天
* 2.2:如果大于的话,则发货时间是后天
* 3:判断发货时间是否是周日,
* 3.1:如果不大于的话,则发货时间不变
* 3.2:如果大于的话,则发货时间再加一天
*
*/
// 获取订单时间
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime orderDateTime = LocalDateTime.parse(orderTime, dateTimeFormatter);

// 设置今天下午三点
LocalDateTime orderEqualTime= orderDateTime.withHour(15).withMinute(0).withSecond(0);
// LocalDateTime orderEqualTime = LocalDateTime.of(LocalDate.now(), LocalTime.of(15, 0, 0));

// 判断订单时间是否在下午三点之前,如果是的话,设定发货时间是明天,否则的话是后天
// 定义一个预发货时间
LocalDateTime preSkipDateTime=orderEqualTime.isAfter(orderDateTime)?orderDateTime.plusDays(1):orderDateTime.plusDays(2);
return isSunday(preSkipDateTime);
}

/**
* 判断预下单时间是否周末
* @param preSendDateTime
* @return
*/
private static LocalDateTime isSunday(LocalDateTime preSendDateTime){
// 获取预下单时间是星期几
DayOfWeek dayOfWeek = preSendDateTime.getDayOfWeek();
// 定义发货时间
return (dayOfWeek!=DayOfWeek.SUNDAY)?preSendDateTime:preSendDateTime.plusDays(1);
}

心得体会
想必通过这三次代码的迭代和重构,大家已经看到的哪些时间类API功能强大;当然他们之中的区别绝不是表面使用方便那么简单,第一种利用Data和Calendar的方式目前不推荐使用,因为SimpleDateFormat作为一个非线程安全的类,被当做了共享变量在多个线程中进行使用,这就出现了线程安全问题。推荐大家使用第二个或者是第三种,第二种是在Java8出现之间一直作为Java时间类的替代品所使用的,通过代码即表明功能依旧很强大。

原文链接:https://blog.csdn.net/zhao1955/article/details/103044685

原文地址:https://www.cnblogs.com/jxjy/p/11864204.html

时间: 2024-10-08 14:30:22

Java中常见时间类的使用的相关文章

Java中六大时间类的使用和区别

关于java中六个时间类的使用和区别 java.util.Date java.sql.Date  java.sql.Time  java.sql.Timestamp java.text.SimpleDateFormat java.util.Calendar java.util.Date日期格式为:年月日时分秒 java.sql.Date日期格式为:年月日java.sql.Time日期格式为:时分秒 java.sql.Timestamp日期格式为:年月日时分秒纳秒(毫微秒) 从数据库中取出来的日期

Java中日期时间类Calendar

一,Calendar类 public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> Calendar类是一个抽象类(Calendar类不能直接创建实例),它为特定瞬间与一组诸如YEAR.MONTH.DAY_OF_MONTH.HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下个星期的日期)提供了一些方法:瞬间可用毫秒值来表示,它是距历元(格林威治时间1970年

java中的时间类

//获得时间方法一 Date d = new Date(); //1. Date导入的包是 java.util.Date //2. 对于Date一旦new便获得当前时间的 //3. d -> 星期 月 日 格林威治时间 GMT+8:00:00 年 DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a HH:mm:ss"); String str = sdf.format(d); //转化时间格式为我们想要的样式//获得时间方法二

Java中Date时间类

Date:表示特定的瞬间,精确到毫秒. 构造方法: Date():根据当前的默认毫秒值创建日期对象 Date(long date):根据给定的毫秒值创建日期对象 public static void mian(String[] args){ //创建对象 Date d = new Date(); System.out.println("d:"+d);//d:Wed Feb 13 19:17:43 CST 2019 //创建对象 lont time = System.currentTim

Java中常见的5种WEB服务器介绍

这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的Web服务器,比较常用的有Tomcat.Resin.JBoss.WebSphere 和 WebLogic 等,下面将分别进行介绍. Tomc

java中常见的输入输出流案例学习

字节输入流: 1.FileInputStream 用途:从文件系统中的文件获得输入字节,常用于读取图像.声音等原始字节流,读取字符流可考虑使用FileReader 详细构造函数与常用方法可参考API文档,网上已经有中文版的API了,我是个E文盲,伤不起 这里介绍一个最常见的方法: read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中. ->off:b字节数组中的偏移量 小知识:数组偏移量,比如a[1,2,3,4,5]

Java中的嵌套类和内部类

以前看<Java编程思想>的时候,看到过嵌套类跟内部类的区别,不过后来就把它们的概念给忘了吧.昨天在看<数据结构与算法分析(Java语言版)>的时候,又遇到了这个概念,当时就很大的疑惑:嵌套类跟内部类有什么区别?只有是否有关键字static的区别吗? 所以今天找了个时间查了一下两者的详细区别,总结在这篇博客中,既方便自己的复习和学习,也启示他人吧. 1,概念: 定义在一个类内部的类,叫作"嵌套类".嵌套类分为两种:static的和非static的.后者又有一个专

java中的File类

File类 java中的File类其实和文件并没有多大关系,它更像一个对文件路径描述的类.它即可以代表某个路径下的特定文件,也可以用来表示该路径的下的所有文件,所以我们不要被它的表象所迷惑.对文件的真正操作,还得需要I/O流的实现. 1.目录列表 如果我们想查看某个目录下有那些文件和目录,我们可以使用File中提供的list方式来查看,这很像linux下的ls命令. 查看E:/html文件夹下所有的php文件,执行的时候输入的参数为正则表达式 1 package com.dy.xidian; 2

Java中常见的设计模式

我在这里稍微总结一下Java中常见的一些设计模式. 1,单例设计模式 单例设计是Java中最常见的模式之一,,它就是要保证程序里边只有一个对象实例.就好比班上都叫他为班长,是因为得保证班上只有一个班长. 单例设计模式的程序设计思想反应的是Java面向对象思想的封装特性.就是为了保证只有一个对象实例,我们私有化它的构造函数,对外只提供一些相关的 公共方法来获得对象实例. 单例设计模式的实现主要分为饿汉式和懒汉式 饿汉式是先对类的对象实例化,随着类的加载对象也加载进来缺点是会造成性能的损耗好处是实现