
计算一年有多少个周的思路:首先,每年至少有52个周,至多有53个周,取决于周一是在哪年(也可以定位周日,这个是由需求决定的),以下是详细代码,其中判断哪一天决定了当周是属于哪一年的逻辑是写在getYearWeekEndDay中。
/
返回指定年度的所有周。List中包含的是String[2]对象<br>
string[0]本周的开始日期,string[1]是本周的结束日期。<br>
日期的格式为yyyy-MM-dd。<br>
每年的第一个周,必须包含星期一且是完整的七天。<br>
例如:2009年的第一个周开始日期为2009-01-05,结束日期为2009-01-11。 <br>
星期一在哪一年,那么包含这个星期的周就是哪一年的周。<br>
例如:2008-12-29是星期一,2009-01-04是星期日,哪么这个周就是2008年度的最后一个周。<br>
@param year 格式 yyyy ,必须大于1900年度 小于9999年
@return
/
public static List<String[]> getWeeksByYear(final int year){
if(year<1900 || year >9999){
throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
}
//实现思路,首先计算当年有多少个周,然后找到每个周的开始日期和结束日期
// Calendar calendar = new GregorianCalendar();
// // 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。
// calendarsetFirstDayOfWeek(CalendarMONDAY); //设置每周的第一天为星期一
// calendarset(CalendarDAY_OF_WEEK, CalendarMONDAY); //每周从周一开始
// 上面两句代码配合,才能实现,每年度的第一个周,是包含第一个星期一的那个周。
// calendarsetMinimalDaysInFirstWeek(7); //设置每周最少为7天
// calendarset(CalendarYEAR, year); // 设置年度为指定的年
// //首先计算当年有多少个周,每年都至少有52个周,个别年度有53个周
int weeks = getWeekNumByYear(year);
// Systemoutprintln(year+"共有"+weeks+"个周");
List<String[]> result = new ArrayList<String[]>(weeks);
for(int i=1;i<=weeks;i++){
String[] tempWeek = new String[2];
tempWeek[0] = getYearWeekFirstDay(year,i);
tempWeek[1] = getYearWeekEndDay (year,i);
//或者使用下面的代码,不过发现效率更低
// tempWeek[0] = getDateAdd(firstWeekDay,(i-1)7+0);
// tempWeek[1] = getDateAdd(firstWeekDay,(i-1)7+6);
resultadd(tempWeek);
// Systemoutprintln(i+"="+tempWeek[0]+"_"+tempWeek[1]);
}
return result;
}
/
计算指定年度共有多少个周。
@param year 格式 yyyy ,必须大于1900年度 小于9999年
@return
/
public static int getWeekNumByYear(final int year){
if(year<1900 || year >9999){
throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
}
int result = 52;//每年至少有52个周 ,最多有53个周。
String date = getYearWeekFirstDay(year,53);
if(datesubstring(0, 4)equals(year+"")){ //判断年度是否相符,如果相符说明有53个周。
result = 53;
}
return result;
}
/
计算某年某周的开始日期
@param yearNum 格式 yyyy ,必须大于1900年度 小于9999年
@param weekNum 1到52或者53
@return 日期,格式为yyyy-MM-dd
/
public static String getYearWeekFirstDay(int yearNum,int weekNum) {
if(yearNum<1900 || yearNum >9999){
throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
}
Calendar cal = CalendargetInstance();
calsetFirstDayOfWeek(CalendarMONDAY); //设置每周的第一天为星期一
calset(CalendarDAY_OF_WEEK, CalendarMONDAY);//每周从周一开始
// 上面两句代码配合,才能实现,每年度的第一个周,是包含第一个星期一的那个周。
calsetMinimalDaysInFirstWeek(7); //设置每周最少为7天
calset(CalendarYEAR, yearNum);
calset(CalendarWEEK_OF_YEAR, weekNum);
//分别取得当前日期的年、月、日
return getFormatDate(calgetTime());
}
/
计算某年某周的结束日期
@param yearNum 格式 yyyy ,必须大于1900年度 小于9999年
@param weekNum 1到52或者53
@return 日期,格式为yyyy-MM-dd
/
public static String getYearWeekEndDay(int yearNum,int weekNum) {
if(yearNum<1900 || yearNum >9999){
throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
}
Calendar cal = CalendargetInstance();
calsetFirstDayOfWeek(CalendarMONDAY); //设置每周的第一天为星期一
calset(CalendarDAY_OF_WEEK, CalendarSUNDAY);//每周从周一开始
// 上面两句代码配合,才能实现,每年度的第一个周,是包含第一个星期一的那个周。
calsetMinimalDaysInFirstWeek(7); //设置每周最少为7天
calset(CalendarYEAR, yearNum);
calset(CalendarWEEK_OF_YEAR, weekNum);
return getFormatDate(calgetTime());
}
List<String> list = new ArrayList<String>();
listadd("2012-11-01 12:12:20");
listadd("2012-11-01 12:13:20");
listadd("2012-11-01 12:10:20");
listadd("2012-10-31 12:14:20");
listadd("2012-11-01 11:14:20");
Systemoutprintln(ArraystoString(listtoArray()));
Date later = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for(String date:list){
try{
if(later == null){
later = sdfparse(date);
}else{
if(laterbefore(sdfparse(date))){
later = sdfparse(date);
}
}
}catch(Exception e){
eprintStackTrace();
}
}
Systemoutprintln(sdfformat(later));
楼主我这方法都拆开了,应该还算比较好理解。。。也有注释
======================================================================
import javatextParseException;
import javatextSimpleDateFormat;
import javautilCalendar;
import javautilDate;
import javautilGregorianCalendar;
public class WeekToDay {
public static void main(String[] args) {
String date = "2012-12-01";
String[] a;
try {
a = getStringDate(date);
for(String k : a){
Systemoutprintln(k);
}
} catch (ParseException e) {
eprintStackTrace();
}
}
public static String[] getStringDate(String date) throws ParseException{
String[] weeks = new String[7];//返回的这周的日期
String[] a = datesplit("-");
int week = getDayOfWeek(a[0], a[1], a[2]);//获取周几
int minWeek = 0;
int maxWeek = 7;
String format = "yyyy-MM-dd";
if(week == 1){//如果是周日(老外是从周日开始算一周,所以有点恶心)
weeks[6] = date;
for(int i = 5; i >= 0; i--){
weeks[i] = getFormatDateAdd(getStrToDate(date, format), -1, format);
date = weeks[i];
}
}else{
int temp = week - 2;
weeks[temp] = date;
for(int i = temp - 1; i >= minWeek; i--){
weeks[i] = getFormatDateAdd(getStrToDate(date, format), -1, format);
date = weeks[i];
}
date = weeks[temp];
for(int i = temp + 1; i < maxWeek; i++){
weeks[i] = getFormatDateAdd(getStrToDate(date, format), 1, format);
date = weeks[i];
}
}
return weeks;
}
/
根据指定的年、月、日返回当前是星期几。1表示星期天、2表示星期一、7表示星期六。
@param year
@param month
month是从1开始的12结束
@param day
@return 返回一个代表当期日期是星期几的数字。1表示星期天、2表示星期一、7表示星期六。
/
public static int getDayOfWeek(String year, String month, String day) {
Calendar cal = new GregorianCalendar(new Integer(year)intValue(),
new Integer(month)intValue() - 1, new Integer(day)intValue());
return calget(CalendarDAY_OF_WEEK);
}
/
取得给定日期加上一定天数后的日期对象
@param date
给定的日期对象
@param amount
需要添加的天数,如果是向前的天数,使用负数就可以
@param format
输出格式
@return Date 加上一定天数以后的Date对象
/
public static String getFormatDateAdd(Date date, int amount, String format) {
Calendar cal = new GregorianCalendar();
calsetTime(date);
caladd(GregorianCalendarDATE, amount);
return getFormatDateTime(calgetTime(), format);
}
/
根据给定的格式与时间(Date类型的),返回时间字符串。最为通用。<br>
@param date
指定的日期
@param format
日期格式字符串
@return String 指定格式的日期字符串
/
public static String getFormatDateTime(Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdfformat(date);
}
/
返回制定日期字符串的date格式
@param date
@param format
@return
@throws ParseException
/
public static Date getStrToDate(String date, String format) throws ParseException{
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdfparse(date);
}
}
package comrxlamozhidao;
import javatextSimpleDateFormat;
import javautilCalendar;
public class Test {
public static void main(String[] args) {
// 获取离当前日期最近的一个星期天
getLastSunday();
}
/
获取离当前日期最近的一个星期天
/
public static void getLastSunday() {
// 获取当前日期
Calendar calendar = CalendargetInstance();
// 距离上个周日的差值
long diffTime = 0L;
// 今天星期几,注:此处周日 = 1 ,周一 = 2 。。。。
int dayOfWeek = calendarget(CalendarDAY_OF_WEEK);
Systemoutprintln("toady:" + dayOfWeek);
// 如果今天是周日,看需求,是取今天的,还是取上周的
if (dayOfWeek == 1){
// 取今天
// dayOfWeek = 1;
// 取上周
dayOfWeek = 8;
}
// 计算当前时间距离上周日的时差,此处一周的开始从周日算起,根据需要
diffTime = (dayOfWeek - 1 ) 24 60 60 1000;
calendarsetTimeInMillis(SystemcurrentTimeMillis() - diffTime);
//
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Systemoutprintln("lastSunday:" + dateFormatformat(calendargetTime()));
// 如果一周的开始从周一计算,并且请注释掉上面的 if (dayOfWeek == 1) 处判断,需要重新判断
if (dayOfWeek == 1){
// 取今天
// dayOfWeek = 0;
// 取上周
dayOfWeek = 7;
}
diffTime = dayOfWeek 24 60 60 1000;
calendarsetTimeInMillis(SystemcurrentTimeMillis() - diffTime);
Systemoutprintln("lastSunday:" + dateFormatformat(calendargetTime()));
}
}
有不明白在问我
以上就是关于java获取一年共有多少周全部的内容,包括:java获取一年共有多少周、如何在java获取一组时间列表的最近时间(for循环输出的一组时间)、java 怎么根据一天的时间得到一周的时间等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)