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
Java中常见时间类的使用的更多相关文章
- JAVA中常见异常类
1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...
- Java中六大时间类的使用和区别
关于java中六个时间类的使用和区别 java.util.Date java.sql.Date java.sql.Time java.sql.Timestamp java.text.SimpleD ...
- Java中Date时间类
Date:表示特定的瞬间,精确到毫秒. 构造方法: Date():根据当前的默认毫秒值创建日期对象 Date(long date):根据给定的毫秒值创建日期对象 public static void ...
- Java 中常见的 final 类
Java 中常见的 final 类 java.lang 包 public final class Boolean extends Object implements Serializable, Com ...
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- java中常见的六种线程池详解
之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如 ...
- JAVA中常见的阻塞队列详解
在之前的线程池的介绍中我们看到了很多阻塞队列,这篇文章我们主要来说说阻塞队列的事. 阻塞队列也就是 BlockingQueue ,这个类是一个接 口,同时继承了 Queue 接口,这两个接口都是在JD ...
- 关于Java中的String类知识点小总结
Java中的String类知识点 前言 在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 如何创建字符串 最简单的方式 String str = "he ...
- java中的File类
File类 java中的File类其实和文件并没有多大关系,它更像一个对文件路径描述的类.它即可以代表某个路径下的特定文件,也可以用来表示该路径的下的所有文件,所以我们不要被它的表象所迷惑.对文件的真 ...
随机推荐
- SQL-W3School-函数:SQL MID() 函数
ylbtech-SQL-W3School-函数:SQL MID() 函数 1.返回顶部 1. MID() 函数 MID 函数用于从文本字段中提取字符. SQL MID() 语法 SELECT MID( ...
- Tracker 服务器地址大全 Tracker List
https://dns.icoa.cn/tracker/ udp://tracker.tiny-vps.com:6969/announce https://1337.abcvg.info/announ ...
- Maven打包SpringBoot
Pom文件提交plugin <build> <finalName>Site</finalName><!--文件名可自定义--> <plugins& ...
- 01.轮播图之一 :scrollView 轮播
接触的每个项目,都会用到轮播图的部分,轮播图都写了好多次,用过各种各样的方式写: 这篇总结的博客,我将分为几个篇幅写,希望写完这几篇博客之后,我能总结出自己写这个轮播的优缺和不同之处 scrollvi ...
- 云计算和 AWS 概述(一)
目录 云计算基础 概念 优势 云计算分类 AWS简介 服务概述 AWS 核心服务 AWS 平台服务 AWS开发和操作服务 AWS 数据中心和可用区(AZ) 区域 可用区 区域名 AWS 云适应框架 ( ...
- nginx限流方案的实现(三种方式)
通过查看nginx官方文档,小弟查看到了三种nginx限流方式. 1.limit_conn_zone 2.limit_req_zone 3.ngx_http_upstream_module 前两种只能 ...
- 使用expect实现自动交互,shell命令行自动输入,脚本自动化,变量引用,expect spawn执行带引号命令,expect 变量为空,不生效,不能匹配通配符*,函数,数组
背景 有需求,在允许命令或者脚本跳出交互行,需要进行内容输入,但需要人手动输入,不是很方便,此时可以通过expect来实现自动互动交互. expect是一个自动交互功能的工具,可以满足代替我们实际工作 ...
- MySQL 全局锁和表锁
根据加锁的范围,MySQL 里面的锁大致可以分成全局锁,表级锁,行锁. 行锁已经在前面几篇文章说过 1. 全局锁 全局锁就是对整个数据库实例加锁.MySQL 提供了一个加全局读锁的方法,命令是Flus ...
- go基础系列 第一章 go基础语法
0.前言 1. go定义变量的几种方式 2. go内建变量类型 3. 常量的定义 4. go枚举 5. go的if语句 零. go语言的换行 go语言对换行很有讲究, 如果想换行,必须有一个逗号, 否 ...
- Edit Delete Mysql的主从复制
参考博客 https://www.cnblogs.com/zhoujie/p/mysql1.html Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服务器上 ...