今天分享一个日期获取和计算的工具类,这个最初是用在项目中获取每周每月日期用的。

<Attention> 之后逛帖子的时候发现了这个专门处理日期的库,java上也有,android上还为了避免使用getResourceAsStream而拖慢app这个问题进行了优化,地址为dlew/joda-time-android

package com.ran.interview;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale; /**
* @author BMR
* @ClassName: CalendarHelper
* @Description: 日期计算工具,标准格式yyyy-MM-dd下各种日期的获取和计算
* @date 2016/2/26 16:08
*/
public class CalendarHelper { private static SimpleDateFormat yyyyMMddFormat;
public final static String[] mMonthCN = new String[]{"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月",
"九月", "十月", "十一月", "十二月"}; public static void setup() {
yyyyMMddFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
} /**
* 显示格式化的月日:eg,2013-03-27,convert to 03月27日
*
* @param dateStr eg,2013-03-27
* @return 03月27日
*/
public static String formatToDay(String dateStr) {
if (CalendarHelper.isStrEmpty(dateStr)) {
return "";
}
//DateFormat localFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.CHINA);
     //在android中上面的Medium也可以得到中文结果,但是直接用java运行的时候不可以,只能改用这个LONG型的了
DateFormat localFormat = DateFormat.getDateInstance(DateFormat.LONG, Locale.CHINESE);
Date date;
String formatDate = null;
try {
date = getDateFromString(dateStr, null);
formatDate = localFormat.format(date);
formatDate = formatDate.substring(5);
} catch (ParseException e) {
e.printStackTrace();
}
return formatDate;
} /**
* 显示格式化的月,中文的月份
*
* @param dateStr eg,2013-03-27
* @return 三月
*/
public static String formatToMonth(String dateStr) {
if (CalendarHelper.isStrEmpty(dateStr)) {
return "";
}
if(dateStr.length() < 7){
return "";
}
String month = dateStr.substring(5, 7);
int index = Integer.parseInt(month);
String formatDate = "";
if (index > 0 && index < 13) {
formatDate = mMonthCN[index - 1];
}
return formatDate;
} /**
* 检查字符串是否是今天
*
* @param dateStr
*/
public static boolean checkIsToday(String dateStr) {
Calendar calendar = Calendar.getInstance();
Date currentDate = calendar.getTime();
return getStringFromDate(currentDate, null).equals(dateStr); } /**
* Get the Date from String with custom format. Default format is yyyy-MM-dd
*
* @param dateString
* @param dateFormat
* @return
* @throws ParseException
*/
public static Date getDateFromString(String dateString, String dateFormat) throws ParseException {
SimpleDateFormat formatter;
if (dateFormat == null) {
if (yyyyMMddFormat == null) {
setup();
}
formatter = yyyyMMddFormat;
} else {
formatter = new SimpleDateFormat(dateFormat, Locale.ENGLISH);
} return formatter.parse(dateString);
} /**
* Convert the Date to String with custom format. Default format is yyyy-MM-dd
*
* @param date
* @param dateFormat
* @return
*/
public static String getStringFromDate(Date date, String dateFormat) {
String dateString = null;
SimpleDateFormat formatter;
if (date == null) {
return null;
}
if (dateFormat == null) {
if (yyyyMMddFormat == null) {
setup();
}
formatter = yyyyMMddFormat;
} else {
formatter = new SimpleDateFormat(dateFormat, Locale.ENGLISH);
}
dateString = formatter.format(date);
return dateString;
} /**
* 获取当天的日期
*
* @return
*/
public static String getTodayDateString() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
return dateFormat.format(new Date());
} /**
* 获取指定日期的偏移后的日期字符串,offset>0日期向后,<0向前
*
* @param dateStr
* @param offset
* @return
*/
public static String getDateStringByOffset(String dateStr, int offset) {
if (offset == 0) {
return dateStr;
}
Date date;
String newDateStr = null;
try {
date = getDateFromString(dateStr, null);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, offset);
newDateStr = getStringFromDate(cal.getTime(), null);
} catch (ParseException e) {
e.printStackTrace();
}
return newDateStr;
} /**
* 获取输入日期所在周的开始日期 (周一),默认格式 yyyy-MM-dd
*
* @param date
* @return String
*/
public static String getFirstDayOfWeek(Date date, String dateFormat) {
String firstDay;
if (date == null) {
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
if (calendar.get(Calendar.DAY_OF_WEEK) == 1) {
calendar.add(Calendar.DATE, -7);
}
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
Date newDate = calendar.getTime();
firstDay = getStringFromDate(newDate, dateFormat);
return firstDay;
} /**
* 获取输入日期所在周的结束日期 (周日),默认格式 yyyy-MM-dd
*
* @param date
* @return String
*/
public static String getLastDayOfWeek(Date date, String dateFormat) {
String lastDay;
if (date == null) {
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 默认周日是本周的开始,
if (calendar.get(Calendar.DAY_OF_WEEK) != 1) {
// 非周末的情况要先加一周才能获得本周的周末
calendar.add(Calendar.DATE, 7);
}
calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
Date newDate = calendar.getTime();
lastDay = getStringFromDate(newDate, dateFormat);
return lastDay;
} /**
* 获得指定日期与指定周数间隔的那周周一的日期
*
* @param date 正数是count周数之后,负数时count周数之前,0 返回本周周一日期
* @param dateFormat
* @return
*/
public static String getFirstDayOfPreviousWeek(Date date, int count, String dateFormat) {
String firstDay;
if (date == null) {
return null;
}
if (count == 0) {
return getFirstDayOfWeek(date, dateFormat);
} Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 默认周日是本周的开始,如果是周末,不加
if (calendar.get(Calendar.DAY_OF_WEEK) == 1) {
calendar.add(Calendar.DATE, (count - 1) * 7);
} else {
calendar.add(Calendar.DATE, count * 7);
} calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
Date newDate = calendar.getTime();
firstDay = getStringFromDate(newDate, dateFormat);
return firstDay;
} /**
* 获得指定日期与指定周数间隔的那周周日的日期
*
* @param date 正数是count周数之后,负数时count周数之前,0 返回本周周日日期
* @param dateFormat
* @return
*/
public static String getLastDayOfPreviousWeek(Date date, int count, String dateFormat) {
String lastDay;
if (date == null) {
return null;
}
if (count == 0) {
return getLastDayOfWeek(date, dateFormat);
} Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 默认周日是本周的开始,要先加一周才能获得本周的周末。如果是周末,不加
if (calendar.get(Calendar.DAY_OF_WEEK) == 1) {
calendar.add(Calendar.DATE, (count) * 7);
} else {
// 非周末的情况要先加一周才能获得本周的周末
calendar.add(Calendar.DATE, (count + 1) * 7);
}
calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
Date newDate = calendar.getTime();
lastDay = getStringFromDate(newDate, dateFormat);
return lastDay;
} /**
* 获取输入日期所在月的开始日期,默认格式 yyyy-MM-dd
*
* @param date
* @return
*/
public static String getFirstDayOfMonth(Date date, String dateFormat) {
String firstDay;
if (date == null) {
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DATE, 1);
Date newDate = calendar.getTime();
firstDay = getStringFromDate(newDate, dateFormat);
return firstDay;
} /**
* 获取输入日期所在月的结束日期,默认格式 yyyy-MM-dd
*
* @param date
* @return String
*/
public static String getLastDayOfMonth(Date date, String dateFormat) {
String lastDay;
if (date == null) {
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
Date newDate = calendar.getTime();
lastDay = getStringFromDate(newDate, dateFormat);
return lastDay;
} /**
* 获取输入日期和间隔月份所在月的开始日期,默认格式 yyyy-MM-dd
*
* @param date
* @param count
* @return
*/
public static String getFirstDayOfPreviousMonth(Date date, int count, String dateFormat) {
String firstDay;
if (date == null) {
return null;
}
if (count == 0) {
return getFirstDayOfMonth(date, dateFormat);
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, count);
calendar.set(Calendar.DATE, 1);
Date newDate = calendar.getTime();
firstDay = getStringFromDate(newDate, dateFormat);
return firstDay;
} /**
* 获取输入日期和间隔月份所在月的最后日期,默认格式 yyyy-MM-dd
*
* @param date
* @param count
* @return
*/
public static String getLastDayOfPreviousMonth(Date date, int count, String dateFormat) {
String firstDay;
if (date == null) {
return null;
}
if (count == 0) {
return getLastDayOfMonth(date, dateFormat);
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, count);
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
Date newDate = calendar.getTime();
firstDay = getStringFromDate(newDate, dateFormat);
return firstDay;
} /**
* 计算两个日期字符串之间的天数,格式2011-12-26
*
* @param dateStart 起始日期
* @param dateEnd 结束日期
* @return
*/
public static int getIntervalDay(String dateStart, String dateEnd) {
Date dateFrom;
Date dateTo;
long gap = 0;
try {
dateFrom = getDateFromString(dateStart, null);
dateTo = getDateFromString(dateEnd, null);
Calendar cal = Calendar.getInstance();
cal.setTime(dateFrom);
long timeFrom = cal.getTimeInMillis();
cal.setTime(dateTo);
long timeTo = cal.getTimeInMillis();
gap = (timeTo - timeFrom) / (1000 * 3600 * 24);
gap = gap + 1;
//从间隔毫秒变成间隔天数</strong>
} catch (ParseException e) {
e.printStackTrace();
}
return (int)gap;
} /**
* 判断字符串是否为空
*
* @param str
* @return
*/
public static boolean isStrEmpty(String str) {
if (null == str || "".equals(str.trim()) || "null".equals(str)) {
return true;
}
return false;
}
}

最后附上几个简单的测试用例:

package com.ran.interview;

import java.util.Date;

/**
* @ClassName: CalendarHelperTest
* @Description: TODO
* @author BMR
* @date 2016年3月15日 上午11:00:49
*/
public class CalendarHelperTest { public static void main(String[] args){
String todayStr = CalendarHelper.getTodayDateString(); System.out.println("today is: "+ todayStr);
System.out.println("check is today: "+ CalendarHelper.checkIsToday(todayStr));
System.out.println("today is (Chinese format): "+ CalendarHelper.formatToDay(todayStr));
System.out.println("今天所在周的周一: "+ CalendarHelper.getFirstDayOfWeek(new Date(), null));
System.out.println("今天所在周的周末: "+ CalendarHelper.getLastDayOfWeek(new Date(), null));
System.out.println("指定日期的格式化的月,中文的月份: "+ CalendarHelper.formatToMonth(todayStr));
System.out.println("获取输入日期所在月的开始日期: "+ CalendarHelper.getFirstDayOfMonth(new Date(), null));
System.out.println("获取输入日期所在月的结束日期: "+ CalendarHelper.getLastDayOfMonth(new Date(), null));
System.out.println("获得指定日期与指定周数间隔的那周周一的日期: "+ CalendarHelper.getFirstDayOfPreviousWeek(new Date(), 2, null));
System.out.println("获得指定日期与指定周数间隔的那周周末的日期: "+ CalendarHelper.getLastDayOfPreviousWeek(new Date(), -2, null));
System.out.println("获取输入日期和间隔月份所在月的开始日期: "+ CalendarHelper.getFirstDayOfPreviousMonth(new Date(), 2, null));
System.out.println("获取输入日期和间隔月份所在月的最后日期: "+ CalendarHelper.getLastDayOfPreviousMonth(new Date(), -2, null));
System.out.println("计算两个日期字符串之间的天数: "+ CalendarHelper.getIntervalDay("2016-03-01", todayStr)); }
}

测试结果打印为:

today is: 2016-03-15
check is today: true
today is (Chinese format): 3月15日
今天所在周的周一: 2016-03-14
今天所在周的周末: 2016-03-20
指定日期的格式化的月,中文的月份: 三月
获取输入日期所在月的开始日期: 2016-03-01
获取输入日期所在月的结束日期: 2016-03-31
获得指定日期与指定周数间隔的那周周一的日期: 2016-03-28
获得指定日期与指定周数间隔的那周周末的日期: 2016-03-06
获取输入日期和间隔月份所在月的开始日期: 2016-05-01
获取输入日期和间隔月份所在月的最后日期: 2016-01-31
计算两个日期字符串之间的天数: 15

CalendarHelper日期计算工具,各种日期的获取和计算的更多相关文章

  1. 时间日期转换工具类,获取当前时间YYYYMMDD24HHMISS、YYYYMMDDHHMISS

    YYYYMMDD24HHMISS:24小时制时间(显示上只是比YYYYMMDDHHMISS中间多了一个24),例:2018102224112440 YYYYMMDDHHMISS:12小时制时间,例20 ...

  2. C# 获取当前月第一天和最后一天 计算两个日期差多少天

    获取当前月的第一天和最后一天 DateTime now = DateTime.Now; DateTime firstDay = ); DateTime lastDay = firstDay.AddMo ...

  3. java 和 mysql 获取周 星期 的第一天 最后一天 或者 月的 日期(字符串转日期,日期转字符串,日期加减)

    获取周的第一天,最后一天 System.out.println(getStartEndDate("2016-05-01", 1)); 获取星期的第一天和最后一天 System.ou ...

  4. java工具类-日期工具类

    1.获得时间戳 为了统一其他语言的如php和unix系统获取的时间戳是10位长度的,精确到秒. java时间戳长度是13位,精确到毫秒 我们获取时间戳需要相应处理. //获取当前时间戳,除以1000, ...

  5. JAVA 日期处理工具类 DateUtils

    package com.genlot.common.utils; import java.sql.Timestamp;import java.text.ParseException;import ja ...

  6. java计算两个日期之间相隔的月份(向下取整)

    最近需求里面有个需要计算两个日期之间相隔的月份,写起来还挺繁琐,需要将各种情况都要考虑到,写了一个作为以后自己的工具吧. //获取哪一天 public static int getDay(Date d ...

  7. java8 Date/Time API 新的日期处理工具

    接上篇文章 java8 新特性 由于上篇过于庞大,使得重点不够清晰,本篇单独拿出 java8 的 Date/Time api 进行说明,新的日期时间工具全部都在 java.time 及其子包中. 新 ...

  8. Java 8——日期时间工具库(java.time)

    一.前言 在介绍Java SE 8中新的日期时间库前,先了解下Java 8之前的日期时间工具的诟病. 在Java SE 8前,日期时间工具库在java.util包中,包括: java.util.Dat ...

  9. DateHandler日期处理工具(JSP中使用后台工具类)

    1.DateHandler.java package Utils.dateHandler; import java.text.ParseException; import java.text.Simp ...

随机推荐

  1. webpack+gulp实现自动构建部署

    项目结构说明 . ├── gulpfile.js # gulp任务配置 ├── mock/ # 假数据文件 ├── package.json # 项目配置 ├── README.md # 项目说明 ├ ...

  2. hdu2095 像水题的不错题 异或运算

    异或运算的基础有点忘记了 先介绍一下..2个数异或 就是对于每一个二进制位进行位运算 具有2个特殊的性质 1.一个数异或本身恒等于0,如5^5恒等于0: 2.一个数异或0恒等于本身,如5^0恒等于5. ...

  3. C#中对输出格式的初始化

    一.在输出的时候,\t和8个空格是不一样的,\t是跳转到下一个水平制表符,如果你在第一个水平制表符中写有数据123,那么跳转后跳转到9的位置上,中间只有5个空格,但是如果用8个空格来做分割的话,就会有 ...

  4. 《JavaScript 闯关记》之数组

    数组是值的有序集合.每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引. JavaScript 数组是无类型的,数组元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的类型 ...

  5. 根据一个旅游网站的psd素材还原的静态页面

    自学web前端的html.css和jquery两个月,想检验下自己的学习成果,遂从网上下了个关于旅游网站的psd素材,自己照着素材还原网站的静态页面. 这是我制作好的静态页面的压缩文件:旅游网站首页. ...

  6. OC学习中遇到的问题总结

    1.不要在初始化的时候用self.方法,因为在初始化的时候self.,此时系统还没有alloc开辟空间,这样做违背了系统流程. 2.善于运用宏定义来控制程序中的变量,这样程序可修改性高. 3.obje ...

  7. vim中使用gdb。

    引用文章A:http://easwy.com/blog/archives/advanced-vim-skills-vim-gdb-vimgdb/ 引用介绍:使用vimgdb来完成gdb的嵌入. 需要的 ...

  8. Eclipse代码风格设置

    在编写代码的过程中,代码的呈现形式是通过eclipse的Formatter配置文件所控制的.我们可以按照自己的习惯生成属于自己的代码风格配置文件,方便规范以后的代码编写形式.具体的操作步骤如下所示:( ...

  9. MYSQL 时间计算的 3 种函数

    方法 1. 加法 adddate('date_expression',interval value type); 'date_expression' + interval value type; -- ...

  10. What does cmd /C mean? [closed] 关于nodejs的子进程部分

    之前一直很不明白为什么 child_process.spawn(command[, args][, options]) shell <Boolean> | <String> I ...