日期的格式有很多形式,在使用过程中经常需要转换,下面是各种类型转换的使用例子以及日期计算方法的例子。

一、不同格式日期相互转换方法

 public class TestDateConvertUtil {

     public static void main(String[] args) throws ParseException {
// 获取当前时间
Date date = new Date(); // 获取当前时间
long timestamp = System.currentTimeMillis(); // 获取当前时间戳 // 日期格式转换
date2String(); // 日期转字符串
string2Date(); // 字符串转日期
date2Timestamp(); // 日期转时间戳
timestamp2Date(); // 时间戳转日期
cst2Date(); // CST格式转日期
nonstandard2Date(); // 非标准格式转日期
convertDateStr(); // 日期字符串格式转换
date2Calendar(); // 日期转日历
calendar2Date(); // 日历转日期
} public static void date2String() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String dateStr = sdf.format(date);
System.out.println(dateStr);
} public static void string2Date() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2018-05-16 19:30:20";
Date date = sdf.parse(dateStr);
System.out.println(date);
} public static void date2Timestamp() {
Date date = new Date();
String timestamp = String.valueOf(date.getTime());
System.out.println(timestamp);
} public static void timestamp2Date() {
String timestamp = "1526470220000";
Date date = new Date(new Long(timestamp));
System.out.println(date);
} public static void cst2Date() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", java.util.Locale.US); // 注意使用Locale.US参数
String cst = "Tue May 16 19:30:20 CST 2018";
Date date = sdf.parse(cst);
System.out.println(date);
} public static void nonstandard2Date() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.setLenient(false); // 设置严格验证日期
String dateStr = "20180516";
Date date = sdf.parse(dateStr);
System.out.println(date);
} public static void convertDateStr() throws ParseException {
SimpleDateFormat sdfSource = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat sdfTarget = new SimpleDateFormat("yyyy-MM-dd");
String dateSource = "20180516";
String dateTarget = sdfTarget.format(sdfSource.parse(dateSource));
System.out.println(dateTarget);
} public static void date2Calendar() {
Date date = new Date();
Calendar c = Calendar.getInstance();
c.setTime(date);
System.out.println(c);
} public static void calendar2Date() {
Calendar c = Calendar.getInstance();
Date date = c.getTime();
System.out.println(date);
}
}

  例子中,setLenient方法默认值为true,意思为宽泛的日期格式校验,比如20180532这样的值转date类型,会自动变成20180601。如果需要严格的日期校验需要设置为false。

二、日期计算方法

  日期的计算通常是通过Calendar类,但使用起来没有这么方便。org.apache.commons.lang3.time.DateUtils类提供了很多简便的日期计算方法,可供使用,其实其底层也是通过Calendar类来实现的。

  下面日期计算例子中DateUtils的方法及参数大部分都有年、月、日、时、分、秒、毫秒之分,可以根据自身需要调用。

 public class TestDateCalculateUtil {

     public static void main(String[] args) throws ParseException {
// 日期计算.例子:2018-05-16 19:30:20
DateUtils.setYears(new Date(), 2019); // 根据参数设置日期年份.输出:2019-05-16 19:30:20
DateUtils.addMonths(new Date(), -1); // 根据参数增加日期月份.输出:2019-04-16 19:30:20
DateUtils.truncate(new Date(), Calendar.DATE); // 根据参数截取日期.输出:2019-04-16 00:00:00
DateUtils.ceiling(new Date(), Calendar.DATE); // 根据参数向上进位日期.输出:2018-05-17 00:00:00
DateUtils.getFragmentInDays(new Date(), Calendar.MONTH); // 根据参数截取范围内日期后返回天数.输出:16
DateUtils.truncatedEquals(new Date(), new Date(), Calendar.DATE); //根据参数范围比较日期是否相同,该例子只比较年月日.输出:true
DateUtils.truncatedCompareTo(new Date(), new Date(), Calendar.MONTH); //根据参数范围比较日期大小,该例子只比较年月.输出:0 // 举例
getFirstSecondOfMonth(); // 获取当月第一秒
getLastSecondOfMonth(); // 获取当月最后一秒
getDayOfYear(); // 获取日期是该年的第几天
getFirstSundayOfMonth(); // 获取当月的第一个周日
} public static void getFirstSecondOfMonth() {
Date date = new Date();
date = DateUtils.truncate(date, Calendar.MONTH); // 截取日期到月份
System.out.println(date); // 输出:2018-05-01 00:00:00
} public static void getLastSecondOfMonth() {
Date date = new Date();
date = DateUtils.ceiling(date, Calendar.MONTH); // 向上进位月份
date = DateUtils.addSeconds(date, -1); // 减1秒
System.out.println(date); // 输出:2018-05-31 23:59:59
} public static void getDayOfYear() {
Date date = new Date();
long day = DateUtils.getFragmentInDays(date, Calendar.YEAR); // 截取年之后的日期部分,并按天数返回
System.out.println(day); // 输出:136
} public static void getFirstSundayOfMonth() {
Date date = new Date();
date = DateUtils.setDays(date, 1); // 从该月第一天开始
while (true) {
Calendar c = Calendar.getInstance();
c.setTime(date);
if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { // 比较该天是否为周日
System.out.println(date); // 输出:2018-05-06 19:30:20
break;
} else {
date = DateUtils.addDays(date, 1);
}
}
}
}

  各个方法之间可以相互组合使用,基本上能解决大部分的日期计算问题。

2018-9-4 更新:计算日期间隔的方法

  日期间隔的计算可以使用org.apache.commons.lang3.time.DurationFormatUtils类提供的formatPeriod方法,也可以根据自身需求稍加封装即可计算年、月、日等间隔。

     public static void main(String[] args) {
// 两个日期之间实际的间隔,并按规定格式返回,如:2018.8.31与2018.9.4 相差5天
String period = DurationFormatUtils.formatPeriod(DateUtils.addDays(new Date(), -5).getTime(), new Date().getTime(), "y-M-d");
System.out.println(period); // 相差5天,输出:0-0-5 // 计算两个月之间的间隔,跨月即算间隔1个月,如:2018.8.31与2018.9.4 相差1个月
int periodOfMonth = getPeriodOfMonth(DateUtils.addDays(new Date(), -5), new Date());
System.out.println(periodOfMonth); // 相差1个月,输出:1
} public static int getPeriodOfMonth(Date dateBegin, Date dateEnd) {
Date begin = DateUtils.truncate(dateBegin, Calendar.MONTH);
Date end = DateUtils.truncate(dateEnd, Calendar.MONTH);
String period = DurationFormatUtils.formatPeriod(begin.getTime(), end.getTime(), "M");
return Integer.parseInt(period);
}

formatPeriod方法中,可选择的格式化参数:

JAVA中日期转换和日期计算的方法的更多相关文章

  1. Java中String转换Double类型 Java小数点后留两位

    Java中String转换Double类型 double num1 = 0.0; String qq = "19.987"; num1 = Double.valueOf(qq.to ...

  2. Java中byte转换int时与0xff进行与运算的原因

    http://w.baike.com/LGAdcWgJBBQxRAHUf.html 转帖 java中byte转换int时为何与0xff进行与运算 在剖析该问题前请看如下代码 public static ...

  3. Java中的float、double计算精度问题

    java中的float.double计算存在精度问题,这不仅仅在java会出现,在其他语言中也会存在,其原因是出在IEEE 754标准上. 而java对此提供了一个用于浮点型计算的类——BigDeci ...

  4. Java中Date和Calender类的使用方法

    查看文章     Java中Date和Calender类的使用方法 2009-10-04 20:49 Date和Calendar是Java类库里提供对时间进行处理的类,由于日期在商业逻辑的应用中占据着 ...

  5. JAVA中文件与Byte数组相互转换的方法

    JAVA中文件与Byte数组相互转换的方法,如下: public class FileUtil { //将文件转换成Byte数组 public static byte[] getBytesByFile ...

  6. Java中获取键盘输入值的三种方法

    Java中获取键盘输入值的三种方法     Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...

  7. VSTO中Word转换Range为Image的方法

    VSTO中Word转换Range为Image的方法 前言 VSTO是一套用于创建自定义Office应用程序的Visual Studio工具包,通过Interop提供的增强Office对象,可以对Wor ...

  8. java中什么是bridge method(桥接方法)

    java中什么是bridge method(桥接方法) https://blog.csdn.net/z69183787/article/details/81115524

  9. (转载)java中判断字符串是否为数字的方法的几种方法

    java中判断字符串是否为数字的方法: 1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < ...

随机推荐

  1. 架构师修练 I - 超级代码控

    可实现的是架构,空谈是概念 So don't tell me the concepts show me the code!  “不懂编码的架构师不是好架构师” 好架构师都是超级代码控.   代码是最好 ...

  2. JVM源码---教你傻瓜式编译openjdk7(JAVA虚拟机爱好者必看)

    LZ经过一个星期断断续续的研究,终于成功的搞定了JDK的成功编译与调试.尽管网络上的教程也有不少,包括源码中也有自带的编译步骤说明,但真正自己动手的话,还是会遇到不少意料之外的错误. 为了方便各位猿友 ...

  3. idea创建web项目教程

    官网下载idea,安装配置好后,双击进来,第一次创建项目时新建是这样的 第一步:   第二步:创建项目名和项目存放的路径 点finish进入这里   第三步: 第二步点OK进入这个页面,点上面那个加号 ...

  4. [Hanani]JAVA大数相关学习记录

    1.Basic remains 题目链接 涉及内容: |大数读入|大数模|大数进制读入时转化为十进制|大数输出时转化为其他进制输出| import java.io.*; import java.mat ...

  5. session和cookie的作用和原理

    session和cookie作用原理,区别 Cookie概念 在浏览某些 网站 时,这些网站会把 一些数据存在 客户端 , 用于使用网站 等跟踪用户,实现用户自定义 功能. 是否设置过期时间: 如果不 ...

  6. PAT甲题题解-1056. Mice and Rice (25)-模拟题

    有n个老鼠,第一行给出n个老鼠的重量,第二行给出他们的顺序.1.每一轮分成若干组,每组m个老鼠,不能整除的多余的作为最后一组.2.每组重量最大的进入下一轮.让你给出每只老鼠最后的排名.很简单,用两个数 ...

  7. 中间件——dubbo

    DUBBO初探-搭建DUBBO开发环境 2016年10月13日 12:27:49 NeroJings 阅读数:1697 标签: dubbo 更多 个人分类: dubbo   我所理解的DUBBO 相对 ...

  8. VMware虚拟机安装ghost win7系统方法

    原本地址:http://www.xitongcheng.com/jiaocheng/xtazjc_article_15314.html

  9. 在delphi中我用DBGrid选择多条记录,如何一次把选择的多条记录删掉

    procedure TForm1.btnDoSumClick(Sender: TObject);var  i: Integer;begin  if DBGrid1.SelectedRows.Count ...

  10. NOIP2017列队(phalanx)解题报告

    列队作为NOIP2017最后一道题,其实并不难,只是相对于其它题目,有点小小的工业 首先,这道题我用splay维护的,如果你不会splay,又想学一下splay,可以来这里学一学,接下来步入正题 首先 ...