业务场景:课程表周次转日期
如,2018年9-1日开学,则9-1日所在的周为第一周(2018年第35周)
通过课程表中第一周,周几获取相应的日期
第二周,周几获取相应的日期,此时的第二周则为,9-1所在周的下一周(2018年第36周)
/*
* @(#)ConvertDate.java Created on 2018年6月8日
* Copyright (c) 2018 ZDSoft Networks, Inc. All rights reserved.
* $Id$
*/
package net.zdsoft.ccstudy.common.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* 周转换日期类
*
* @author Administrator
* @version $Revision: 1.0 $, $Date: 2018年6月8日 下午4:25:22 $
*/
public class ConvertDate {
public static void main(String[] args) {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
// 获取结束周
int computeWeeks = 0;
try {
computeWeeks = ConvertDate.computeWeeks(sf.parse("2018-9-1"), sf.parse("2019-1-1"));
}
catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
ConvertDate cd = new ConvertDate();
Date startDate = null;
try {
startDate = sf.parse("2018-9-1");
}
catch (ParseException e) {
e.printStackTrace();
}
for (int i = 1; i <= computeWeeks; i++) {
String dateStr1 = getDateStr(2018, startDate, i, 3);
System.out.println("对应日期(不分单双周):" + dateStr1);
// System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2018, cd.getWeekDiff(startDate) + i, 1));
// System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2018, cd.getWeekDiff("2018-09-01") + i, 2));
// System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2018, cd.getWeekDiff("2018-09-01") + i, 3));
// System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2018, cd.getWeekDiff("2018-09-01") + i, 4));
// System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2018, cd.getWeekDiff("2018-09-01") + i, 5));
// System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2018, cd.getWeekDiff("2018-09-01") + i, 6));
// System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2018, cd.getWeekDiff("2018-09-01") + i, 7));
}
for (int i = 1; i <= computeWeeks; i++) {
if (i % 2 != 0) {
String dateStr = getDateStr(2018, startDate, i, 3);
System.out.println("对应日期(单周):" + dateStr);
}
}
for (int i = 1; i <= computeWeeks; i++) {
if (i % 2 == 0) {
String dateStr = getDateStr(2018, startDate, i, 3);
System.out.println("对应日期(双周):" + dateStr);
}
}
System.out.println("当前周" + getTimeInterval(new Date()));
// System.out.println("结束周:" + cd.computeWeeksByStr("2018-09-01", "2019-01-01"));
// System.out.println("结束时间:" + cd.getEndDayOfWeekNo(2018, cd.getWeekDiff("2019-01-01")));
}
/**
* 传入起始时间,第几周第几天算出日期,例如,2018-9-1日起,则9-1所在的周为第一周,依次往后推算
*
* @param year
* 当前年
* @param startTime
* 起始时间
* @param week
* 第几周
* @param weekDay
* 周几
* @return
*/
public static String getDateStr(int year, Date startTime, Integer week, int weekDay) {
String dateStr = "";
dateStr = getStartDayOfWeekNo(year, getWeekDiff(startTime) + week, weekDay);
return dateStr;
}
/**
* 计算两个日期间相隔的周数
*
* @param startDate
* 开始日期
* @param endDate
* 结束日期
* @return
*
*/
public static int computeWeeksByStr(String sDate, String eDate) {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = null;
Date endDate = null;
try {
startDate = sf.parse(sDate);
endDate = sf.parse(eDate);
}
catch (ParseException e) {
e.printStackTrace();
}
int weeks = 0;
Calendar beginCalendar = Calendar.getInstance();
beginCalendar.setTime(startDate);
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endDate);
while (beginCalendar.before(endCalendar)) {
// 如果开始日期和结束日期在同年、同月且当前月的同一周时结束循环
if (beginCalendar.get(Calendar.YEAR) == endCalendar.get(Calendar.YEAR)
&& beginCalendar.get(Calendar.MONTH) == endCalendar.get(Calendar.MONTH) && beginCalendar
.get(Calendar.DAY_OF_WEEK_IN_MONTH) == endCalendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)) {
break;
}
else {
beginCalendar.add(Calendar.DAY_OF_YEAR, 7);
weeks += 1;
}
}
return weeks;
}
/**
* 计算两个日期间相隔的周数
*
* @param startDate
* 开始日期
* @param endDate
* 结束日期
* @return
*
*/
public static int computeWeeks(Date startDate, Date endDate) {
int weeks = 0;
Calendar beginCalendar = Calendar.getInstance();
beginCalendar.setTime(startDate);
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endDate);
while (beginCalendar.before(endCalendar)) {
// 如果开始日期和结束日期在同年、同月且当前月的同一周时结束循环
if (beginCalendar.get(Calendar.YEAR) == endCalendar.get(Calendar.YEAR)
&& beginCalendar.get(Calendar.MONTH) == endCalendar.get(Calendar.MONTH) && beginCalendar
.get(Calendar.DAY_OF_WEEK_IN_MONTH) == endCalendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)) {
break;
}
else {
beginCalendar.add(Calendar.DAY_OF_YEAR, 7);
weeks += 1;
}
}
return weeks;
}
/**
* 获取一个日期对应的周次
*
* @param startTime
* 时间
* @return
*/
public static int getWeekDiff(Date startTime) {
// 创建一个日期实例
Calendar ca = Calendar.getInstance();
// 实例化一个日期
ca.setTime(startTime);
// 获取是第几周
return ca.get(Calendar.WEEK_OF_YEAR) - 1;
}
/**
* 获取第一天通过某月某年
*
* @param year
* @param month
* @return
*/
public static String getFirstDayOfMonth(int year, int month) {
String monthStr = month < 10 ? "0" + month : String.valueOf(month);
return year + "-" + monthStr + "-" + "01";
}
/**
* 月的最后一天
*
* @param year
* @param month
* @return
*/
public static String getLastDayOfMonth(int year, int month) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
calendar.set(Calendar.DATE, 1);
calendar.add(Calendar.MONTH, 1);
calendar.add(Calendar.DAY_OF_YEAR, -1);
return calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-"
+ calendar.get(Calendar.DAY_OF_MONTH);
}
/**
* 获取年
*
* @param year
* @return
*/
private static Calendar getCalendarFormYear(int year) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
cal.set(Calendar.YEAR, year);
return cal;
}
/**
* 通过周次获取开始时间
*
* @param year
* 当前年
* @param weekNo
* 周次
* @day 周几
* @return
*/
public static String getStartDayOfWeekNo(int year, int weekNo, int day) {
Calendar cal = getCalendarFormYear(year);
cal.set(Calendar.WEEK_OF_YEAR, weekNo);
if (day > 0) {
cal.add(Calendar.DAY_OF_MONTH, day - 1);
}
return cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DAY_OF_MONTH);
}
/**
* 通过周次获取结束时间
*
* @param year
* 当前年
* @param weekNo
* 周次
* @return
*/
public static String getEndDayOfWeekNo(int year, int weekNo) {
Calendar cal = getCalendarFormYear(year);
cal.set(Calendar.WEEK_OF_YEAR, weekNo);
cal.add(Calendar.DAY_OF_WEEK, 6);
return cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DAY_OF_MONTH);
}
/**
* 根据当前日期获得所在周的日期区间(周一和周日日期)
*
* @return
* @author zhaoxuepu
* @throws ParseException
*/
public static String[] getTimeInterval(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.setTime(date);
// 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了
int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
if (1 == dayWeek) {
cal.add(Calendar.DAY_OF_MONTH, -1);
}
// System.out.println("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期
// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
cal.setFirstDayOfWeek(Calendar.MONDAY);
// 获得当前日期是一个星期的第几天
int day = cal.get(Calendar.DAY_OF_WEEK);
// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
String imptimeBegin = sdf.format(cal.getTime());
// System.out.println("所在周星期一的日期:" + imptimeBegin);
cal.add(Calendar.DATE, 6);
String imptimeEnd = sdf.format(cal.getTime());
// System.out.println("所在周星期日的日期:" + imptimeEnd);
return new String[] { imptimeBegin, imptimeEnd };
}
}
执行main方法,结果如下:
开始时间: 2018-8-27
开始时间: 2018-8-28
开始时间: 2018-8-29
开始时间: 2018-8-30
开始时间: 2018-8-31
开始时间: 2018-9-1
开始时间: 2018-9-2
开始时间: 2018-9-3
开始时间: 2018-9-4
开始时间: 2018-9-5
开始时间: 2018-9-6
开始时间: 2018-9-7
开始时间: 2018-9-8
开始时间: 2018-9-9
开始时间: 2018-9-10
开始时间: 2018-9-11
开始时间: 2018-9-12
开始时间: 2018-9-13
开始时间: 2018-9-14
开始时间: 2018-9-15
开始时间: 2018-9-16
开始时间: 2018-9-17
开始时间: 2018-9-18
开始时间: 2018-9-19
开始时间: 2018-9-20
开始时间: 2018-9-21
开始时间: 2018-9-22
开始时间: 2018-9-23