`

获得某年某月的第N周的日期

    博客分类:
  • java
 
阅读更多
本人工作至今3年有余,昨天花了2-3小时竟然没有把:通过指定某年某月的xx周的一周日期得到,无比伤心,今早通过自己码代码,也算是完成了这个需求,到网站找了很久也没有找到比较好的API,所以我贴出我自己的测试代码,如有更好的代码请分享一下,谢谢!

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class WeekCalendar
{
    /**
     * 常见的日期格式
     */
    public final static String DATEFORMAT003 = "yyyy-MM-dd";

    // 本月第一周的开始日期
    public final static int WEEK_1 = 1;

    // 本月第二周的开始日期
    public final static int WEEK_2 = 8;

    // 本月第三周的开始日期
    public final static int WEEK_3 = 15;

    // 本月第四周的开始日期
    public final static int WEEK_4 = 22;

    // 本月第五周的开始日期(闰年二月有29天有五周,平年二月28天就只有四周了)
    public final static int WEEK_5 = 29;

    /**
     * 根据指定的日期格式转换日期
     * 
     * @param date 需要转换格式的日期
     * @param formatStr 日期格式
     * @return 转换之后的日期
     */
    public static String dateConvetStringByFormat(Date date, String formatStr)
    {
        SimpleDateFormat myformat = new SimpleDateFormat(formatStr);
        String after_date = null;
        if (date != null)
        {
            after_date = myformat.format(date);
        }
        return after_date;
    }

    /**
     * 获得指定月的最后一天
     * @param year 指定的年
     * @param month 指定的月
     * 
     * @return Integer
     */
    public static int getMonthLastDay(int year, int month)
    {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, (month - 1));// 月份从0开始,得减去1
        calendar.set(Calendar.DATE, 1);
        // 得到这月的最后一天
        calendar.roll(Calendar.DATE, -1);

        return calendar.get(Calendar.DATE);
    }

    /**
     * 获得某月的共几个周
     * 
     * @param year 指定的年
     * @param month 指定的月
     * 
     * @return Integer[]
     */
    public static int getMonthAllWeeks(int year, int month)
    {
        // 获得这一月的最后一天
        int lastDay = getMonthLastDay(year, month);

        // 最多五周
        if (lastDay >= WEEK_5)
        {
            return 5;
        }
        return 4;
    }

    /**
     * 获得xx月的第xx周的一周(7天)日期,拼凑成日期格式
     * 
     * @param year 指定的年
     * @param month 指定的月
     * @param week 指定的周
     * 
     * @return String[]
     */
    public static String[] getMonthWeekDayCalendar(int year, int month, int week)
    {
        // 用来存储一周的日期
        String[] dates = new String[7];

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, (month - 1));// 月份从0开始,得减去1

        // 获得这月共有几周
        int weekSum = getMonthAllWeeks(year, month);

        // 判断输入的周数是否超过总周数
        if (week <= weekSum)
        {
            // 没有超过总周数
            int weekBeginDay = 1;

            // 设置周的开始日期
            switch (week)
            {
                case 2:
                    weekBeginDay = WEEK_2;
                    break;
                case 3:
                    weekBeginDay = WEEK_3;
                    break;
                case 4:
                    weekBeginDay = WEEK_4;
                    break;
                case 5:
                    weekBeginDay = WEEK_5;
                    break;
            }
            // 获得这一月的最后一天
            int lastDay = getMonthLastDay(year, month);

            int index = 0;
            // i<=lastDay 一般到了第五周就是29号了,不到7天了,必须要在下个月1号之前终止循环
            for (int i = weekBeginDay; i <= lastDay; i++)
            {
                // 如果循环了7次,此次循环结束
                if ((i - 7) >= weekBeginDay)
                {
                    break;
                }
                calendar.set(Calendar.DATE, i);
                // 格式化日期
                dates[index] = dateConvetStringByFormat(calendar.getTime(),
                        DATEFORMAT003);
                // System.out.println(dates[index]);
                index++;
            }
        }

        return dates;
    }

    public static void main(String[] args)
    {
        // 测试代码
        getMonthWeekDayCalendar(2013, 6, 4);
    }
}
分享到:
评论

相关推荐

    c# 计算自1970-1-1 为起始时间 加上时间段为n秒后的现在的日期,绝对准确

    输入`604800`秒(一周的时间)应该得到1970年1月8日的日期等。 ### 四、总结 通过以上方法,我们可以精确地计算从1970年1月1日开始加上任意秒数后得到的日期,并将其转换为本地时间。这种方法适用于需要精确计算...

    根据日期计算星期几的C语言代码

    最终,通过计算从公元1年开始到输入日期的总天数,然后取模7(一周有7天),可以得到星期几。具体地,模运算的结果为0表示星期日,1表示星期一,以此类推。 ### 代码分析 ```c #include"stdio.h" void main() { ...

    用C语言编写的万年历,实现输入某一年打印这一年的每个月份信息

    在本示例中,通过C语言实现了这样一个程序,它可以接收用户输入的某一年份,然后输出该年的每月日历。 #### 2. 关键函数解释 在C语言中编写万年历程序通常涉及日期计算、闰年判断等功能。下面详细介绍几个关键函数...

    DateFormatUtils时间获取及格式化工具类

    获取给定日期N天后的日期 获取某月开始时间 获取本月第一天字符串 获取某月的结束时间戳 判断日期字符串是否正确的日期格式 获取下一个分钟值以x或者y结尾的时间点(单位:毫秒) 获取上一个分钟值以x或者y结尾的...

    输入年和月控制台输入日历

    这段代码通过判断当前日期是否为一周的最后一天来换行,从而实现了按周输出日历的功能。 综上所述,通过这段代码的学习,我们不仅可以了解到如何在Java中实现基本的控制台输入输出功能,还可以深入了解如何计算特定...

    php 获取一个月第一天与最后一天的代码

    这样可以确保我们得到的是下个月的第一天的前一天,也就是输入日期所在月份的最后一天。 4. 最后,`date()` 再次被用来格式化最后一天的时间戳,返回 `"Y-m-d"` 格式的结果,如 "2022-03-31"。 5. 函数返回一个数组...

    插入简单的动态变化的日期、时间

    time.innerText = getFullYear() + "年" + (getMonth() + 1) + "月" + getDate() + "日" + "星期" + "日一二三四五六".charAt(getDay()) + "\n" + getHours() + ":" + getMinutes() + ":" + getSeconds(); // ...

    mysql的日期和时间函数

    -&gt; 52 你可能会争辩说,当给定的日期值实际上是 1999 年的第 52 周的一部分时,MySQL 对 WEEK() 函数应该返回 52。我们决定返回 0 ,是因为我们希望该函数返回“在指定年份中是第几周”。当与其它的提取...

    sql高级进阶

    - 周的计算:根据日期计算某年某月某日是星期几。 - 确定一年内属于周内某一天的所有日期:生成一周内各天的所有日期。 - 确定某月内第一个和最后一个“周内某天”的日期:找到某月第一个和最后一个指定周内的...

    蔡勒公式的总结

    假设我们要计算2016年3月1日是星期几,根据蔡勒公式我们可以得到: - \( C = 20 \) - \( y = 16 \) - \( M = 1 \)(3月) - \( d = 1 \) 将这些值代入蔡勒公式中进行计算,即可得出结果为星期二(\( W = 2 \))。 ...

    DataStage常用函数大全.doc

    22. **NthWeekdayFromDate**: 获取指定日期后的第N个某一周日。 23. **PreviousWeekdayFromDate**: 获取指定日期前的工作日。 24. **SecondsFromTime**: 从时间中提取秒数。 25. **SecondsSinceFromTimestamp**: 从...

    火线100天广西专版2016中考英语总复习第一部分第九课时八上Units9_10试题

    本资料主要涉及的是初中英语复习材料,特别是针对广西地区2016年中考的备考资源,其中第九课时的主题为“人际交往”。以下是相关知识点的详细解析: ### 单词 1. **prepare** (v.) - 准备;使做好准备 - 这个词在...

    acm模拟题c语言编程题

    1. **日期计算**:涉及到计算某一天是一周中的第几天,这需要理解如何计算从年初到这一天总共经过了多少天,再通过取模运算得到星期几。 - **非闰年计算**:对于非闰年,可以预设每个月的天数,并加上年份的天数...

    江苏省淮安市七年级地理上学期第一次月考试题(无答案) 新人教版 试题.doc

    6. 太阳直射与热量分布:地球上获得太阳热量最多的地方是低纬度,因为阳光直射角度大,能量集中;赤道位于热带,全年都有太阳直射;南北回归线之间是热带,有阳光直射现象;30°N位于温带,无阳光直射。 7. 极昼...

    Shell中取今天、昨天、前天的时间操作代码

    `date`命令的`-d`选项非常强大,它支持多种时间描述方式,如`+n weeks`(n周后)、`-n months`(n个月前)等。你可以根据需要调整时间描述字符串来获取任何你想获取的日期。 在实际的Shell脚本编写中,这些时间操作...

    stata操作介绍之时间序列四PPT学习教案.pptx

    例如,在教程中,使用了1983年1月至7月Milford城镇的自来水消费量数据进行演示。首先,通过`.use`命令导入数据,并使用`.describe`查看数据的基本统计信息。接着,生成日期变量,使用`.tsset`命令设置时间序列,绘制...

    FMLDATA的源码

    YYY为分析周期,如果是日线数据,则YYY=DAY,分笔、1分钟、5分钟、15分钟、30分钟、60分钟、周、月、多日、季度、半年、年的值分别为TICK、MIN1、MIN5、MIN15、MIN30、MIN60、WEEK、MONTH、NDAYS、QUARTER、SEMIYEAR...

    六年级下册量与计量复习.docx

    1. **日期相关知识**:中华人民共和国成立是1949年10月1日,这一年是平年,这个月份有31天。 2. **几何问题**:用棱长1cm的小正方体木块堆成一个棱长1dm的正方体,需要1000块。 3. **月份天数**:一年中,每月是...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7个字节分别表示世纪、年、月、日、时、分和秒 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体...

    二叉排序树与平衡二叉树的实现

    指导教师(签字) 日期 年 月 日 教研室意见: 年 月 日 学生(签字): 接受任务时间: 年 月 日 注:任务书由指导教师填写。 课程设计(论文)指导教师成绩评定表 题目名称 二叉排序树与平衡二叉树的实现 ...

Global site tag (gtag.js) - Google Analytics