## 日常总结获取时间类之===>>>获取日期
前提:
日常项目中,难免会遇到跟时间日期有关的功能需求
博主已经整理过时间戳的方法,此文是关于日期获取
本文皆用 Java 8版本之前的 java.util 包中的 Date 和 Calendar 处理
理解都在代码注释中!!!
**
代码片:
1、获取日期—>>>关于SimpleFormatDate的格式总结
/** 1、 获取日期
* 对 SimpleDateFormat 中的格式参数的解析用法
* @return 返回:2020年11月15日 01:26:08, 上下午标志:==> 上午, 星期日,一年中的第320天,
* 一月中的第3个星期,一年中的第47个星期,一月中的第3个星期,+0800 ,时区:CST
* 补充: CST:China Standard Time,翻译成中文就是:中国标准时间。
* 中国是在东八区,时间原点是在零度经线(伦敦),也就是说伦敦0点时,中国8点。
*/
public static String formatDate(){
StringBuilder dateFormat = new StringBuilder();
dateFormat.append("yyyy年MM月dd日 HH:mm:ss,") // HH:24小时制(0-23),hh:12小时制(0-12)
.append(" 上下午标志:==> a,") // a 上下午标志
.append(" E,") // E 星期几
.append("一年中的第D天,") // D 一年中的第几天
.append("一月中的第F个星期,") // F 一月中的第几个星期(会把这个月总共过的天数除以7),实际情况不推荐使用
.append("一年中的第w个星期,") // w(小写) 一年中的第几个星期
.append("一月中的第W个星期,") // W(大写) 一月中的第几个星期(会根据实际情况即日历来算)
.append("Z ,")
.append("时区:z"); // z(小写) 时区 CST(China Standard Time)代表中国标准时间
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat.toString());
String date = sdf.format(new Date());
return date;
}
2、时间戳(10位或13位都行)转换日期—>>> 第一种方法
/** 2、 时间戳转换日期 第一种方法
* 通过 时间戳 -->>> 获取 转换为指定格式的 date日期形式
* @param timetemp 时间戳 可以是10位 也可以是13位的时间戳
* 10位时间戳 转换为指定格式有两种方法,此处使用的是 java.sql.Timestamp; 13位可以直接转换
* @param format 日期格式 如:yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd
* @return String 类型的日期
* 如: Long time = System.currentTimeMillis();
* Long time1 = System.currentTimeMillis()/1000;
* getTimeInMillisToDate(time,"yyyyMMdd") 结果格式 都一样 是 20190427
*/
public static String changeTimeIToDateOne(Long timetemp,String format){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
// 如果 long 类型的时间戳是 10位的需要 使用 Timestamp 处理一下
if (timetemp.toString().length() == 10){
Object time = new Timestamp(timetemp*1000);
String date = simpleDateFormat.format(time);
return date;
}
String date = simpleDateFormat.format(timetemp);
return date;
}
3、时间戳转换日期—>>> 第二种方法
/** 3、 时间戳转换日期 第二种方法
* 将 10位 时间戳 --->>>
* 转换为 指定格式 的日期,这是第二种方法 ,此处利用 java.util.Calendar.setTimeInMillis(time*1000)
* @param time Long类型 的时间戳
* @param format 日期格式
* @return String类型的 日期时间,也可以返回Long类型,需要使用Long.valueOf() 或 Long.parseLong()方法
* 不过要注意 Long类型 的 format格式就不能有-连接符了 只能是 yyyyMMdd 这种格式
* 如:changeTimeToDate(System.currentTimeMillis()/1000,"yyyy-MM-dd HH:mm:ss") 结果 2019-04-27 01:05:28
*/
public static String changeTimeToDateTwo(Long time,String format){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(time*1000);
Date dt = calendar.getTime();
String date = simpleDateFormat.format(dt);
return date;
}
4、获取日期—>>>获取当前时间对应的>>>指定年份,指定月份获取
/** 4、 获取日期
* 根据 输入类型 --->>> 获取当前时间 对应的 指定年份,指定月份 指定日期格式 的时间
* @param month 指定月份 如当前为6月,1 代表上个月==>>5月 2代表 4月份
* @param year 指定年份 如 1 代表去年 2代表前年
* @param format 指定日期格式 决定返回 日期的 格式 可以是 yyyyMMdd , yyyy-MM-dd HH:mm:ss 多种格式
* @return String 类型的 日期 根据日期格式 来 返回
* 如 当前时间是 2019/4/27 getLastDate(1,1,"yyyyMMdd") 获取 去年3月27 的时间 结果20180327
*/
public static String getDateWithType(int month,int year,String format){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.YEAR,-year);
calendar.add(Calendar.MONTH,-month);
Date dt = calendar.getTime();
String date = simpleDateFormat.format(dt);
return date;
}
5、周-获取周几—>>> 第一种方法 核心:Calendar
/** 5、周-获取周几 第一种方法 核心:Calendar
* 依据指定格式的日期,获取其日期对应的是周几
* @param format 日期格式 如:new SimpleDateFormat("yyyyMMdd")
* @param day 日期 如:20200520 格式需要与 format 中对应
* @return 周三
* @throws ParseException
*/
public static String getWeek(SimpleDateFormat format,String day) throws ParseException {
// 美式排序日历以星期日开始
String[] weekDay = {"周日","周一","周二","周三","周四","周五","周六"};
Date date = format.parse(day);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int w = calendar.get(Calendar.DAY_OF_WEEK ) - 1;
if (w < 0)
w =0;
return weekDay[w];
}
6、周-获取周几—>>> 第二种方法 核心:SimpleDateFormat
/** 6、周-获取周几 第二种方法 核心:SimpleDateFormat
* 依据日期获取对应的星期几
* @param date Date类型日期 new Date()当前日期
* 可以依据第一种方法中的SimpleDateFormat转换,
* 也可以根据时间戳计算,如:new Date(1589036081 * 1000L) 1589036081 2020-05-09 22:54:41
* @return 星期六
* 补充: 对于 SimpleDateFormat 中的参数:
* E 代表星期, MMMM 代表中文月份,如:十一月, MM 代表月份,如:11
*/
public static String getWeekTwo(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("E");
String week = sdf.format(date);
return week;
}
7、周-获取某年的第几周
/** 7、周-获取某年的第几周
* 根据日期获取此日期属于指定年份的第几周
* @param date 日期 如:new Date(1520836148 * 1000L) 代表 ==>> 2018-03-12 14:29:08
* @param year 年份 如:2019
* @return 11 说明 2018年3月12 属于 2018年的第11个周
*/
public static int getWeekWithYear(Date date,int year){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.YEAR,year);
int week_year = calendar.get(Calendar.WEEK_OF_YEAR);
return week_year;
}
8、周-当前周开始和结束日期
/** 8、周-当前周日期
* 获取当前时间所在周的周一和周日的日期
* @return 如:当前时间 2019-12-1 返回:{monday=20191125, sunday=20191201}
*/
public static Map<String,Object> getWeekDayWithNowTime(){
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
Calendar mondayCal = Calendar.getInstance();
mondayCal.setTime(new Date());
int weekDay = mondayCal.get(Calendar.DAY_OF_WEEK);
String monday = null;
if (1 == weekDay){
mondayCal.add(Calendar.DATE,-6);
monday = format.format(mondayCal.getTime());
}else {
mondayCal.setFirstDayOfWeek(Calendar.MONDAY); // 将 Calendar.MONDAY 的值 2 赋值给一周的第一天值
mondayCal.add(Calendar.DATE,mondayCal.getFirstDayOfWeek() - weekDay);
monday = format.format(mondayCal.getTime());
}
// 为了给日历赋最新值,以便计算周日
Date date = mondayCal.getTime();
Calendar sundayCal = Calendar.getInstance();
sundayCal.setTime(date);
sundayCal.add(Calendar.DATE,+6);
String sunday = format.format(sundayCal.getTime());
Map<String,Object> map = new LinkedHashMap<>();
map.put("monday",monday);
map.put("sunday",sunday);
return map;
}
9、周-所有周日期------>>> 获取一段时间内所有周的周一和周日日期
/** 9、周-所有周日期 -->>> 获取一段时间内所有周的周一和周日日期
* 获取指定年(某一年)开始到现在当前日期,这段时间内所有周的,周一和周日的日期(包含当前时间周)
* @param year 指定年份 如:2019
* @param format 返回日期格式 如:new SimpleDateFormat("yyyyMMdd")
* @return Map类型的list集合,
* 如:{monday=20181231, sunday=20190106}, {monday=20190107, sunday=20190113},...,{monday=20201116, sunday=20201122}]
* 补充:1. compareTo()方法知识点
* compareTo 比较前后两个字符串的 asc码的差值,多字母字符串时,依次比较一个一个字符串
* 如:a1="ac" a2="ab",比较的第二个字符串,
* 结果:正数代表 第一个数 大于 第二个数,负数代表第一个数 小于第二个数
* @throws ParseException
*/
public static List<Map<String,Object>> getAllWeekWithYear(int year, SimpleDateFormat format) throws ParseException {
List<Map<String,Object>> weekData = new ArrayList<>();
Calendar startDate = Calendar.getInstance();
//代码底层,Month是以 0 为基础,0代表一月
//原因,在公历和朱利安日历中每年的第一个月份,它是0,所以month是一个特殊的值
startDate.set(year,0,1); // 设置开始日期
String startDay = format.format(startDate.getTime());
Calendar nowDate = Calendar.getInstance();
nowDate.setTime(new Date());
String nowDay = format.format(nowDate.getTime());
// 通过 while 比较指定日期与当前日期的大小,并不断使历史日期 +1,来进行循环
while(startDay.compareTo(nowDay) <= 0){
int dayWeek = startDate.get(Calendar.DAY_OF_WEEK);
if (dayWeek == Calendar.SUNDAY){
String sunday = format.format(startDate.getTime()); // 周日的日期结果
Calendar mondayCalendat = Calendar.getInstance();
mondayCalendat.setTime(format.parse(sunday));
mondayCalendat.add(Calendar.DATE,-6);
String monday = format.format(mondayCalendat.getTime()); // 周一的日期结果
Map<String,Object> map = new LinkedHashMap<>();
map.put("monday",monday);
map.put("sunday",sunday);
weekData.add(map);
}
// 获取当前日期所在周,注意:当前日期不能是周日!!!
if (startDay.compareTo(nowDay) == 0 && dayWeek > Calendar.SUNDAY){
/*周一在Calendar中,Calendar.DAY_OF_WEEK 中,数值 2 代表周一
如果当前时间的数值 > 2,则 2 减去 当前时间的数值就是对应的周一日期
比如说 3,3代表周二,要求周一的值,则需要减去一天,而在Calendar.add()方法中,是添加-1,就是 2-3 */
startDate.add(Calendar.DATE,2 - dayWeek );
String monday = format.format(startDate.getTime());
startDate.add(Calendar.DATE,+6 );
String sunday = format.format(startDate.getTime());
Map<String,Object> map = new LinkedHashMap<>();
map.put("monday",monday);
map.put("sunday",sunday);
weekData.add(map);
}
startDate.add(Calendar.DATE,1);
startDay = format.format(startDate.getTime());
}
return weekData;
}
10、月-当前月日期 ------>>> 依据 Calendat 先求开始日期,再求结束日期
/** 10、月-当前月日期 --->>> 依据 Calendat 先求开始日期,再求结束日期
* 根据指定年份,指定月份获取 此年此月的开始和结束日期,
* @param year 指定年份 如:2019
* @param month 指定月份 如:2
* @param format 返回日期格式 如:new SimpleDateFormat("yyyyMMdd")
* @return Map类型的值 {beginDate=20190201, endDate=20190228}
* 补充: 注意HashMap的存储与输出顺序!!
*/
public static Map<String,String> getMonthWithYear(int year, int month, SimpleDateFormat format){
//SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
Calendar cal = Calendar.getInstance();
cal.set(year,month - 1,1); // 先求指定月份的开始值,每个月都从1号开始,所以日期为1
String startDate = format.format(cal.getTime()); // 结果:指定月份开始值
// 求结束值,设置年、月、日
cal.set(Calendar.YEAR,year);
cal.set(Calendar.MONTH,month - 1);
int endDateNum = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // 不能使用 getMaximum()方法,具体原因看源码
cal.set(Calendar.DATE,endDateNum);
//cal.set(Calendar.DAY_OF_MONTH,endDateNum); 效果等同于上行代码
String endDate = format.format(cal.getTime()); // 结果:指定年份指定月份中的最后一天
Map<String,String> map = new HashMap<>();
//HashMap存储数据时不会按照存储的顺序遍历输出,会按照String键值排好序输出,
//如果要按照数据存储的顺序拿出来,则可以使用 LinkedHashMap,它是HashMap的子类,它会保存记录的插入顺序
//map.put("startDate",startDate);
map.put("beginDate",startDate);
map.put("endDate",endDate);
return map;
}
11、月-所有月日期------>>> 依据 getMonthWithYear() 获取
/** 11、月-所有月日期 -->> 依据 getMonthWithYear() 获取
* 获取指定年份-指定月份,到现在为止,此段时间内所有月份的开始和结束日期
* @param year 指定年份 如:2019
* @param month 指定月份 如:11
* @return List结果集 举例:当前时间 2020-02-15
* [{beginDate=20191101, endDate=20191130}, {beginDate=20191201, endDate=20191231},
* {beginDate=20200101, endDate=20200131}, {beginDate=20200201, endDate=20200229}]
*/
public static List<Map<String,String>> getAllMonth(int year,int month){
List<Map<String,String>> monthList = new ArrayList<>();
Date day = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
String[] date = format.format(day).split("-");
int nowYear = Integer.parseInt(date[0]);
int nowMonth = Integer.parseInt(date[1]);
while (true){
monthList.add(getMonthWithYear(year,month,new SimpleDateFormat("yyyyMMdd")));
if (year == nowYear && month == (nowMonth - 1)){
//添加当前月份的开始和结束日期,+1 是因为在 getMonthWithYear()方法中的month已经减 1 了,不+1就相当于减了2次
// 如果不要包含当前月份的开始结束日期,则去掉此行代码
monthList.add(getMonthWithYear(year,month + 1,new SimpleDateFormat("yyyyMMdd")));
return monthList;
}
month = month + 1;
if (13 == month){
year = year + 1;
month = 1; // month 为1,因为在getMonthWithYear()方法中,month还要进行减 1
}
}
}
12、季度-指定年月所在季度
/** 12、季度-指定年月所在季度
* 获取指定年份,指定月份所在季度的开始日期和结束日期,以及所在一年中的第几季度(quarter参数)
* month参数可以去掉,去掉后就相当于求 当前时间的指定年份所在季度的开始和结束日期
* @param year 指定年份 如:2018
* @param month 指定月份:如:5(5月)
* @return Map结果集: {quarterStartDay=20180401, quarterEndDay=20180630}
*/
public static Map<String, String> getQuarter(int year, int month) {
Map<String, String> map = new LinkedHashMap<>();
Calendar calendar = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
calendar.set(Calendar.MONTH, month - 1); //可去掉,用于求当前时间所在指定年份的 季度日期
int m = calendar.get(Calendar.MONTH);
int quarter = 0;
if (m >= 0 && m <= 2) {
quarter = 1; // 月份所在第几季度
map = getQuarterStartDayOrEndDay(quarter, year, format);
} else if (m >= 3 && m <= 5) {
quarter = 2;
map = getQuarterStartDayOrEndDay(quarter, year, format);
} else if (m >= 6 && m <= 8) {
quarter = 3;
map = getQuarterStartDayOrEndDay(quarter, year, format);
} else {
quarter = 4;
map = getQuarterStartDayOrEndDay(quarter, year, format);
}
return map;
}
// 附属,求季度开始和结束日期需要用此方法
public static Map<String, String> getQuarterStartDayOrEndDay(int quarter, int year, SimpleDateFormat format) {
Map<String, String> map = new LinkedHashMap<>();
Calendar calendar = Calendar.getInstance();
//一年有4个季度,而月份是以0为基础,所以季度*3 -3 就是每个季度所在年份对应的数值
int startMonth = quarter * 3 - 3;
calendar.set(year, startMonth, 1);
String quarterStartDay = format.format(calendar.getTime());
// 求季度结束日期
calendar.set(Calendar.MONTH, startMonth + 2);
int endDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DATE, endDay);
String quarterEndDay = format.format(calendar.getTime());
map.put("quarterStartDay", quarterStartDay);
map.put("quarterEndDay", quarterEndDay);
return map;
}
13、季度-所有季度日期
/** 13、季度-所有季度日期
* 获取指定年份,指定月份,到现在为止,这段时间内季度的开始和结束日期(包括当前时间)
*
* @param year 指定年份 如:2018
* @param month 指定月份:如:5(5月)
* @return List结果集:举例:当前时间 2019-7-22
* [{quarterStartDay=20180401, quarterEndDay=20180630}, {quarterStartDay=20180701, quarterEndDay=20180930},
* {quarterStartDay=20181001, quarterEndDay=20181231}, {quarterStartDay=20190101, quarterEndDay=20190331},
* {quarterStartDay=20190401, quarterEndDay=20190630}]
*/
public static List<Map<String, String>> getAllQuarter(int year, int month) {
List<Map<String, String>> quarterList = new ArrayList<>();
Date day = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
String[] date = format.format(day).split("-");
int nowYear = Integer.parseInt(date[0]);
int nowMonth = Integer.parseInt(date[1]);
while (true) {
quarterList.add(getQuarter(year, month));
if (year == nowYear && month >= (nowMonth - 3)) {
return quarterList;
}
month = month + 3;
if (month > 13) {
year = year + 1;
month = 1;
}
}
}
结束语:
此文为关于日期的获取对应方法,时间戳的获取方法在博主其他文章,如有需要,请退出此文查看,如果某些地方不对,还希望大家评论,一定回复,希望大家积极探讨。一起在 java的路途走下去。加油!
如有帮助,还请点赞!!!