精华内容
下载资源
问答
  • 获取某的第一和最后个星期

    千次阅读 2017-04-15 01:19:11
    想着获取当前是第周,先获取开学那天,看了两年的校历好像是9月份第一个星期一和2月份最后个星期一。

    想着获取当前是第几周,先获取开学那天,看了两年的校历好像是9月份第一个星期一和2月份最后个星期一。

    如下图9月第一个星期一是9月5号
    9月

    最后个星期一是2月27号
    2月

    代码如下

    
    class DayUtils{
        /**
         * 指定年月的第一个星期一
         * @param year
         * @param month
         */
        static void firstMonday(int year, int month){
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, year);
            cal.set(Calendar.MONTH, month - 1); //从0开始
            int day = 1;
            cal.set(Calendar.DAY_OF_MONTH, day);    //从第一天开始找第一个星期一
            while(cal.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY){
                cal.set(Calendar.DAY_OF_MONTH, ++day);
            }
            Date firstMonday = cal.getTime();
            String dtStr = new SimpleDateFormat("yyyy-MM-dd").format(firstMonday);
            System.out.println(dtStr);
        }
    
        /**
         * 指定年月的最后个星期一
         * @param year
         * @param month
         */
        static void lastMonday(int year, int month){
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, year);
            cal.set(Calendar.MONTH, month - 1);
            cal.set(Calendar.DAY_OF_MONTH, 1);  //防止getInstance()返回今天是2月29号,被认为是3月了
            int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);  //每个月的最大天数
            cal.set(Calendar.DAY_OF_MONTH, lastDay);
            while(cal.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY){
                cal.set(Calendar.DAY_OF_MONTH, --lastDay);
            }
            Date lastMonday = cal.getTime();
            String dtStr = new SimpleDateFormat("yyyy-MM-dd").format(lastMonday);
            System.out.println(dtStr);
        }
    
        /**
         * 返回指定年月的第一天(1号)是星期几
         * @param year
         * @param month
         */
        static int DayofFirstDay(int year, int month){
            int[] weekDays = {7, 1, 2, 3, 4, 5, 6};
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, year);
            cal.set(Calendar.MONTH, month - 1); //从0开始
            cal.set(Calendar.DAY_OF_MONTH, 1);  
            int day = cal.get(Calendar.DAY_OF_WEEK) - 1 ;
            if(day < 0) day = 0;
    
            System.out.println("星期"+weekDays[day]);
            return weekDays[day];
        }
    }
    
    
    public class Main {
        public static void main(String[] args) {
            DayUtils.lastMonday(2016,2);
            DayUtils.lastMonday(2017,2);
            DayUtils.firstMonday(2016,9);
            DayUtils.firstMonday(2017,9);
        }
    }
    展开全文
  • 利用LocalDate获取每月几号,每周

    万次阅读 2018-12-08 23:23:43
    下面的工具类即利用LocalDate来获取指定范围内的日期,每周四,每31(没有则略过) import java.time.DayOfWeek; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time....

           jdk8为我们提供了非常好用的时间日期工具类。我们可以使用LocalDate 、LocalTime 、LocalDateTime来表示日期和时间,拥有极为方便的API满足业务需求,并且和数据库的字段可直接对应。这几个可以满足开发中的所有需求,极力推荐使用,请彻底放弃那些难用的Date 、Calendar吧!

    Java8中的时间核心功能类如下:

    描述
    LocalTime 只包含时间,如05:08:45
    LocalDate 只包含日期 如2019-02-05
    LocalDateTime 日期与时间,如2019-02-05 05:08:45(无时区)
    ZonedOffset 时区的偏移量,如 +08:00
    ZonedDateTime 包含时区的日期与时间
    Instant 时间戳,表达为“1970年初到这个时间点一共经过了多少纳秒
    Duration 表达一段时间,可以说Duration是两个Instant之间的时间差
    Period 时间段
    Clock 时钟
    DateTimeFormatter 负责格式化转换,内置了许多常用的格式。替换了之前的simpleDateFormatter

    Java 7中包含下表中列出的类与方法:(这里仅作为一个回顾,推荐使用上面介绍的java8中新的日期类)

    描述
    System.currentTimeMillis() 一个静态方法,返回当前日期时间(从1970年初到当前时间,经过了多少毫秒)
    java.util.Date 用于表示日期和时间的类,大多数里头的方法已经不推荐使用了(deprecated).
    java.sql.Date 用于表示日期的类,所有时间信息全被砍掉了,一般在数据库连接时使用
    java.sql.Timestamp 同上,只是保留了时间信息。
    java.util.Calendar 一个Calendar的基本类,可以对日期和时间进行操作,如加一天、一月、一年等等。
    java.util.TimeZone 用于表达时区的类,当跨时区进行Calendar操作时很有用。
    SimpleDateFormat 帮助把字符串解析为Date的类,同时也可将Date格式化为字符串。

    在时间与字符串转换时经常会用到的表示:

    y   = 年份 (yy or yyyy)
    M   = 月份 (MM)
    d   = 一个月中的第几天      (dd)
    h   = 小时 (0-12)  (hh)
    H   = 小时 (0-23)  (HH)
    m   = 一小时中的第几分钟 (mm)
    s   = 秒   (ss)
    S   = 毫秒 (SSS)
    z   = 时区 (比如:Pacific Standard Time)
    Z   = 时区的时差 (比如:-0800)
    
    
    yyyy-MM-dd           (2009-12-31)
    yyyy-MM-dd HH:mm:ss  (2009-12-31 23:59:59)
    HH:mm:ss.SSS         (23:59.59.999)
    yyyy-MM-dd HH:mm:ss.SSS   (2009-12-31 23:59:59.999)
    
     // 两个都是ISO的标准时间格式,即2019-12-05T11:27:55.517+08:00
     public static final String DATE_FORMAT_ISO = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ";
     public static final String DATE_FORMAT_ISO_2 = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
    

    1. 下面的工具类即利用LocalDate来获取指定范围内的日期,每周四,每月31号(没有则略过)

    
    import java.time.DayOfWeek;
    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    import java.time.temporal.ChronoUnit;
    import java.time.temporal.TemporalField;
    import java.time.temporal.WeekFields;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    /**
     * @author 94977
     * @create 2018/12/8
     */
    public class DateUtil {
    
    
        public static final String DATE_FORMAT_YYYY_MM_DD = "yyyy-MM-dd";
    
    
        public static LocalDate getLocalDateByStr(String str){
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT_YYYY_MM_DD);
           return LocalDate.parse(str, formatter);
        }
    
        /**
        * 获取指定日期范围内的所有指定星期 包含开始日期和结束日期
         * @param weeks 1,3,7表示周一,周三,周日
        * @return List<LocalDate>
        */
       public static List<LocalDate> getWeekLocalDateListByRange(LocalDate startDay, LocalDate endDay, List<String> weeks) {
            List<LocalDate> localDateList = new ArrayList<>();
            TemporalField fieldISO = WeekFields.of(DayOfWeek.of(1), 1).dayOfWeek();
            LocalDate tempDay;
            for (String week : weeks) {
                tempDay = startDay.with(fieldISO, Long.parseLong(week));
                if (tempDay.isBefore(startDay)) {
                    tempDay = tempDay.plusWeeks(1);
                }
                while (tempDay.isBefore(endDay) || tempDay.isEqual(endDay)) {
                    localDateList.add(tempDay);
                    tempDay = tempDay.plusWeeks(1);
                }
            }
            return localDateList;
        }
    
        /**
         * 获取指定日期范围内的所有指定dayOfMonth 包含开始日期和结束日期
         * @param months 1,29,31表示每月的1号,29号,31号
         * @return List<LocalDate>
         */
        public static List<LocalDate> getLocalDateListByMonth(LocalDate startDate,LocalDate endDate,List<String> months){
            List<LocalDate> localDateList = new ArrayList<>();
    
            LocalDate localDate; 
            for(String month : months){
           		 LocalDate tempDate = startDate;
                while (tempDate.isBefore(endDate) || tempDate.getMonthValue() == endDate.getMonthValue()){
                    if(tempDate.lengthOfMonth() >= Integer.valueOf(month)){
                        localDate = tempDate.withDayOfMonth(Integer.valueOf(month));
                        if(localDate.isAfter(startDate) || localDate.isEqual(startDate)){
                            localDate = tempDate.withDayOfMonth(Integer.valueOf(month));
                            if(localDate.isEqual(endDate) || localDate.isBefore(endDate)){
                                localDateList.add(localDate);
                            }
                        }
                    }
                    tempDate = tempDate.plusMonths(1);
                }
            }
            return localDateList;
        }
    
        /**
        * 获取指定范围内所有日期,包含开始日期和结束日期
        * @return List<LocalDate>
        */
        public static List<LocalDate> getLocalDateByDay(LocalDate startDate,LocalDate endDate){
            List<LocalDate> localDateList = Stream.iterate(startDate, date -> date.plusDays(1)).
                    limit(ChronoUnit.DAYS.between(startDate, endDate))
                    .collect(Collectors.toList());
            localDateList.add(endDate);
            return localDateList;
        }
    
        public static void main(String[] args) {
            LocalDate startDate = getLocalDateByStr("2018-10-27");
            LocalDate endDate = getLocalDateByStr("2018-11-05");
            System.out.println(getLocalDateByDay(startDate,endDate));
            List<String> strings = new ArrayList<>();
            strings.add("31");
            List<LocalDate> localDateListByweek = getLocalDateListByMonth(startDate, endDate, strings);
            System.out.println(localDateListByweek);
        }
    
    }
    
    

    2. 获取当天最晚和最早的时间

    	public static final String DATE_FORMAT_ISO_8601 = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
    
        /**
         * 转为ISO8601标准时间 2018-12-12T14:03:27.505+0800,使用默认时区
         * @param localDateTime localDateTime
         */
        public static String getStandardTime(LocalDateTime localDateTime){
            DateTimeFormatter pattern = DateTimeFormatter.ofPattern(DATE_FORMAT_ISO_8601);
            ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
            return pattern.format(zonedDateTime);
        }
    
        /**
         * 返回当天最晚的时间2018-12-16T23:59:59.000+0800,使用默认时区
         * @param localDate localDate
         */
        public static String getEndTime(LocalDate localDate){
            return getStandardTime(localDate.plusDays(1).atStartOfDay().minusSeconds(1));
        }
    
        /**
         * 返回当天最早的时间2018-12-16T00:00:00.000+0800,使用默认时区
         * @param localDate localDate
         */
        public static String getStartTime(LocalDate localDate){
            return getStandardTime(localDate.atStartOfDay());
        }
    
    展开全文
  • 我们先用1月份的第一个星期一作为起点,然后以七天为一个间隔,查看一个星期一的日期,如果是新的一个月星期一,则输出,如果在已经输出的这个月,则继续加上7天向寻找,知道找完这一年为止。 基本思路就是...

    获取当年年份

    #include<time.h>

    main()
    {
    time_t timep;
    struct tm *p;
    time (&timep);
    p=gmtime(&timep);
    printf("%d\n",p->tm_sec); /*获取当前秒*/
    printf("%d\n",p->tm_min); /*获取当前分*/
    printf("%d\n",8+p->tm_hour);/*获取当前时,这里获取西方的时间,刚好相差八个小时*/
    printf("%d\n",p->tm_mday);/*获取当前月份日数,范围是1-31*/
    printf("%d\n",1+p->tm_mon);/*获取当前月份,范围是0-11,所以要加1*/
    printf("%d\n",1900+p->tm_year);/*获取当前年份,从1900开始,所以要加1900*/
    printf("%d\n",p->tm_yday); /*从今年1月1日算起至今的天数,范围为0-365*/

    }

    https://zhidao.baidu.com/question/558299804.html


    月份判断星期几 

    #include "stdio.h"
    #include <stdlib.h>  // 缺少头文件 
     
    main()
    {
        int y,m,d,a,b;
        b=0;
        scanf("%d%d%d",&y,&m,&d); 
        if(m>12||m<0) 
        {
            b=1;                          // b=1 后面少了逗号 
            printf("month is error.\n");  // 最后面少了逗号
        }                                 // 这里结尾的分号去掉
        else 
        {
            if(d<0) 
            {
                b=1; 
                printf("day is error.\n");// 最后面少了逗号
            }                             // 这里结尾的分号去掉
        else
        switch(m)
        {
        case 1: if(d>32) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号 
        case 2: if((y%4==0&&y%100!=0)||(y%400==0)) a=1;            
                            // 这里把 a==1 改成 a=1 
        else a==2;                                                 
                            // 这里把 a==2 改成 a=2
        if(a==1&&d>30) {b=1; printf("day is error.\n");}; break;   
                            // 问题同上,少逗号
        if(a==2&&d>29) {b=1; printf("day is error.\n");}; break;   
                            // 问题同上,少逗号
        case 3: if(d>32) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号
        case 4: if(d>31) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号
        case 5: if(d>32) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号
        case 6: if(d>31) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号
        case 7: if(d>32) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号
        case 8: if(d>32) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号
        case 9: if(d>31) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号
        case 10: if(d>32) {b=1; printf("day is error.\n");}; break;
                            // 问题同上,少逗号
        case 11: if(d>31) {b=1; printf("day is error.\n");}; break;
                            // 问题同上,少逗号
        case 12: if(d>32) {b=1; printf("day is error.\n");}; break;
                            // 问题同上,少逗号
        }
        }
        if(m==1||m==2) {
            m+=12;
            y--;} 
         
        if(b==0) {int iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 
           // 这里把 b=0 改成 b==0 
        switch(iWeek)
        {
        case 0: printf("1\n"); break;
        case 1: printf("2\n"); break;
        case 2: printf("3\n"); break;
        case 3: printf("4\n"); break;
        case 4: printf("5\n"); break;
        case 5: printf("6\n"); break;
        case 6: printf("0\n"); break;
        } 
        }
        system("pause"); 
    }

    https://zhidao.baidu.com/question/1238216961329183379.html

    作者:陈默
    链接:https://www.zhihu.com/question/51789552/answer/127750014
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    蔡勒公式:
    &amp;lt;img src=&quot;https://pic2.zhimg.com/v2-31a2c831436a892f14b15fcb38e3b5c9_b.jpg&quot; data-rawwidth=&quot;1042&quot; data-rawheight=&quot;114&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1042&quot; data-original=&quot;https://pic2.zhimg.com/v2-31a2c831436a892f14b15fcb38e3b5c9_r.jpg&quot;&amp;gt;

    公式中的符号含义如下:

    • w:星期(0-星期日;1-星期一;2-星期二;3-星期三;4-星期四;5-星期五;6-星期六)
    • c:年份前两位数
    • y:年份后两位数
    • m:月(m的取值范围为3至14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算)
    • d:日
    • [ ]:称作高斯符号,代表向下取整,即,取不大于原数的最大整数。
    • mod:同余(这里代表括号里的答案除以7后的余数)
    &amp;lt;img src=&quot;https://pic1.zhimg.com/v2-ed68522e8b1e9bbd358dad973c78625c_b.png&quot; data-rawwidth=&quot;1089&quot; data-rawheight=&quot;338&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1089&quot; data-original=&quot;https://pic1.zhimg.com/v2-ed68522e8b1e9bbd358dad973c78625c_r.png&quot;&amp;gt;https://zh.wikipedia.org/zh-hans/蔡勒公式
    有一个公式可以计算:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 
    w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。(C是世纪数减一,y是年份后两位,M是月份,d是日数。1月和2月要按上一年的13月和 14月来算,这时C和y均按上一年取值。)
    算出来的W除以7,余数是几就是星期几。如果余数是0,则为星期日。
    
    https://zhidao.baidu.com/question/243564537.html
    

    简单,用蔡勒公式即可:

    #include <stdio.h>

    int main ()

    {

      int y, m, d, c, w;

      printf ("输入年 月 日(空格间隔):");

      scanf ("%d %d %d", &y, &m, &d);

      if (m ==1 || m == 2) { //判断月份是否为1或2

        y--;

        m += 12;

      }

      c = y / 100;

      y = y - c * 100;

      w = (c / 4) - 2 * c + (y + y / 4) + (13 * (m + 1) / 5) + d - 1;

      while (w < 0) w += 7;

      w %= 7;

      if (w == 0) printf ("星期日");

      else printf ("星期%d", w);

      return 0;

    }

    https://zhidao.baidu.com/question/1510495711879567580.html

    如何写个程序计算出每个月的第一个星期一对应的日期

    在前面,我们分别利用泰勒公式和C标准库中的mktime()函数推算了某个特定日期所对应的星期几,刚做完这些,就又遇到了一个与日期相关的新任务:

    老板把每个月例会的时间定在了每个月的第一个星期一,他让我把具体日期整理出来,发给每一个成员,提醒大家准时参加。

    简单地讲,也就是把每个月的第一个星期一对应的日期提取出来。如果时间范围比较短(比如一年),自己翻翻日历勉强也能解决,如果要是时间范围比较长(比如十年),再去一个个翻日历,就麻烦了。怎么办?

    还记得我们在学了C语言,如何统计一篇英文文章中的单词数?中所认识和体会到的:

    程序,就是用来帮助人们完成这些看起来枯燥繁琐但是带有一定规律性的事情的。

    面对这个麻烦而又有一定规律的问题,我们同样可以用C语言写个程序来解决。

    如何解决呢?想想我们是如何在日历中找出每个月的第一个星期一的?我们先用1月份的第一个星期一作为起点,然后以七天为一个间隔,查看下一个星期一的日期,如果是新的一个月的星期一,则输出,如果在已经输出的这个月,则继续加上7天向下寻找,知道找完这一年为止。

    基本思路就是这样,但是,我们这里还用到了mktime()函数的一个特点,也就是如果输入的分解时间的日期tm_mday超出了其取值范围[0,30],mktime()会将其折算成相邻月份的日期,比如,某个月的tm_mday 为32,而这个月只有30天,mktime()会将其视作下个月的第二天,而不会将其视作日期错误。利用这个特性,我们就可以通过递增tm_mday完成整个一年的遍历访问量了。

    按照上面分析的思路,我们可以将其实现如下:

    #include <string.h> #include <time.h> #include <stdio.h> //#include <stdbool.h> #define YEAR 2017 int main() {     struct tm t;     memset(&t,0,sizeof(t));     //用年月日填充分解时间t     //这里指定1月中的第一个星期为起点     t.tm_year = YEAR - 1900; // 年份,减去起始年份     t.tm_mon = 1 - 1; // 月份     t.tm_mday = 1;  // 2013年1月7日是1月份的第一个星期一  修改处     (这儿我们写成第一个星期日)     puts("the first mondays in 2017 are");     // 记录已经输出的月份     int lastmon = -1;     while(1)     {         //将分解时间t转换为日历时间ct         time_t ct = mktime(&t);         if(-1 == ct) //日期错误         {             break;         }         else         {             //用localtime()函数获取日历时间ct对应的分解时间             struct tm* bt = localtime(&ct);             //判断是否在2013年内             if(bt->tm_year != YEAR-1900)             {                 break;             }             //判断这个星期一是否是本月的第一个星期一             if(t.tm_mon != lastmon)             {                 //如果是,输出对应的日期                 printf("%d - %d\n",bt->tm_mon+1,bt->tm_mday);                 //记录本月已经输出                 lastmon = bt->tm_mon;             }             t = *bt;  //更新日期             t.tm_mday += 7; //检查下一个星期一         }     }     return 0; }
    http://www.cnblogs.com/kingshow123/archive/2013/11/01/firstmonday.html
    
    2017年每个月份第一个星期日对应的日期:
    #include <string.h>
    #include <time.h>
    #include <stdio.h>
    int getxq();


    //#include <stdbool.h>
    //#define YEAR 2016   //宏规定时间
    int YEAR ;
    int main()
    {    




    //变量获取时间


    time_t timep;
    struct tm *p;
    time (&timep);
    p=gmtime(&timep);
    YEAR=1900+p->tm_year;












        struct tm t;
        memset(&t,0,sizeof(t));
        //用年月日填充分解时间t
        //这里指定1月中的第一个星期为起点
        t.tm_year = YEAR - 1900; // 年份,减去起始年份
        t.tm_mon = 1 - 1; // 月份


        t.tm_mday = 1+7-getxq();  // 2013年1月7日是1月份的第一个星期一  修改处     (这儿我们写成第一个星期日)
        puts("the first mondays in 2017 are");
        // 记录已经输出的月份
        int lastmon = -1;
        while(1)
        {
            //将分解时间t转换为日历时间ct
            time_t ct = mktime(&t);
            if(-1 == ct) //日期错误
            {
                break;
            }
            else
            {
                //用localtime()函数获取日历时间ct对应的分解时间
                struct tm* bt = localtime(&ct);
                //判断是否在2013年内
                if(bt->tm_year != YEAR-1900)
                {
                    break;
                }
                //判断这个星期一是否是本月的第一个星期一
                if(t.tm_mon != lastmon)
                {
                    //如果是,输出对应的日期
                    printf("%d - %d\n",bt->tm_mon+1,bt->tm_mday);
                    //记录本月已经输出
                    lastmon = bt->tm_mon;
                }
                t = *bt;  //更新日期
                t.tm_mday += 7; //检查下一个星期一
            }
        }


        return 0;
    }


    int getxq()
    {/*int YEAR ;
    time_t timep;
    struct tm *p;
    time (&timep);
    p=gmtime(&timep);
    YEAR=1900+p->tm_year;*/




        int y,m,d,a,b;
        b=0;
      y=YEAR;
      m=1;
      d=1; //当年1月1号的星期几


        if(m>12||m<0) 
        {
            b=1;                          // b=1 后面少了逗号 
            printf("month is error.\n");  // 最后面少了逗号
        }                                 // 这里结尾的分号去掉
        else 
        {
            if(d<0) 
            {
                b=1; 
                printf("day is error.\n");// 最后面少了逗号
            }                             // 这里结尾的分号去掉
        else
        switch(m)
        {
        case 1: if(d>32) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号 
        case 2: if((y%4==0&&y%100!=0)||(y%400==0)) a=1;            
                            // 这里把 a==1 改成 a=1 
        else a==2;                                                 
                            // 这里把 a==2 改成 a=2
        if(a==1&&d>30) {b=1; printf("day is error.\n");}; break;   
                            // 问题同上,少逗号
        if(a==2&&d>29) {b=1; printf("day is error.\n");}; break;   
                            // 问题同上,少逗号
        case 3: if(d>32) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号
        case 4: if(d>31) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号
        case 5: if(d>32) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号
        case 6: if(d>31) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号
        case 7: if(d>32) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号
        case 8: if(d>32) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号
        case 9: if(d>31) {b=1; printf("day is error.\n");}; break; 
                            // 问题同上,少逗号
        case 10: if(d>32) {b=1; printf("day is error.\n");}; break;
                            // 问题同上,少逗号
        case 11: if(d>31) {b=1; printf("day is error.\n");}; break;
                            // 问题同上,少逗号
        case 12: if(d>32) {b=1; printf("day is error.\n");}; break;
                            // 问题同上,少逗号
        }
        }
        if(m==1||m==2) {
            m+=12;
            y--;} 
         
        if(b==0) {int iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 
           // 这里把 b=0 改成 b==0 
        switch(iWeek)
        {
        case 0: return 1; break;
        case 1: return 2; break;
        case 2: return 3; break;
        case 3: return 4; break;
        case 4: return 5; break;
        case 5: return 6; break;
        case 6: return 7; break;
        } 
        }
      
    }






    展开全文
  • 经典的switch版,但是获得上月天数的时候,我只是把月份-1了,估计当时太困了吧,再看到有种毛骨悚然的感觉,本来是想再处理一下的,但是一想肯定还有什么超方便的方法,于是找到了下面这版本,做了一点小修改。...

    今天写程序的时候,突然发现了很早以前写的获取月份天数的函数,经典的switch版,但是获得上月天数的时候,我只是把月份-1了,估计当时太困了吧,再看到有种毛骨悚然的感觉,本来是想再处理一下的,但是一想肯定还有什么超方便的方法,于是找到了下面这个版本,做了一点小修改。

      获取本月日期:

    1
    2
    3
    4
    5
    function getMonth($date){
      $firstday = date("Y-m-01",strtotime($date));
      $lastday = date("Y-m-d",strtotime("$firstday +1 month -1 day"));
      return array($firstday,$lastday);
    }

      $firstday是月份的第一天,假如$date是2014-2这样的话,$firstday就会是2014-02-01,然后根据$firstday加一个月就是2014-03-01,再减一天就是2014-02-28,用date()和strtotime()真是太方便了。

      获取上月日期:

    1
    2
    3
    4
    5
    6
    function getlastMonthDays($date){
      $timestamp=strtotime($date);
      $firstday=date('Y-m-01',strtotime(date('Y',$timestamp).'-'.(date('m',$timestamp)-1).'-01'));
      $lastday=date('Y-m-d',strtotime("$firstday +1 month -1 day"));
      return array($firstday,$lastday);
    }

      上月日期需要先获取一个时间戳,然后在月份上-1就OK了,超智能的date()会把2014-0-1这种东西转换成2013-12-01,太爽了。

      获取下月日期:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function getNextMonthDays($date){
      $timestamp=strtotime($date);
      $arr=getdate($timestamp);
      if($arr['mon'] == 12){
        $year=$arr['year'] +1;
        $month=$arr['mon'] -11;
        $firstday=$year.'-0'.$month.'-01';
        $lastday=date('Y-m-d',strtotime("$firstday +1 month -1 day"));
      }else{
        $firstday=date('Y-m-01',strtotime(date('Y',$timestamp).'-'.(date('m',$timestamp)+1).'-01'));
        $lastday=date('Y-m-d',strtotime("$firstday +1 month -1 day"));
      }
      return array($firstday,$lastday);
    }

      下月日期的代码看起来比较长一点,因为date()转不了类似2014-13-01这种东西,它会直接回到1970,所以前面需要处理一下12月的问题,除了12月就直接月份+1就OK啦。

      总得来说,还是很方便的,日期函数太强大了。

    最后简单介绍下strtotime的用法

    获取指定日期的unix时间戳

      strtotime("2009-1-22") 示例如下:
      echo strtotime("2009-1-22")
      结果:1232553600
      说明:返回2009年1月22日0点0分0秒时间戳

    获取英文文本日期时间

      示例如下:
      便于比较,使用date将当时间戳与指定时间戳转换成系统时间

      (1)打印明天此时的时间戳strtotime("+1 day")
      当前时间:
      echo date("Y-m-d H:i:s",time())
      结果:2009-01-22 09:40:25
      指定时间:
      echo date("Y-m-d H:i:s",strtotime("+1 day"))
      结果:2009-01-23 09:40:25

      (2)打印昨天此时的时间戳strtotime("-1 day")
      当前时间:
      echo date("Y-m-d H:i:s",time())
      结果:2009-01-22 09:40:25
      指定时间:
      echo date("Y-m-d H:i:s",strtotime("-1 day"))
      结果:2009-01-21 09:40:25

      (3)打印下个星期此时的时间戳strtotime("+1 week")
      当前时间:
      echo date("Y-m-d H:i:s",time())
      结果:2009-01-22 09:40:25
      指定时间:
      echo date("Y-m-d H:i:s",strtotime("+1 week"))
      结果:2009-01-29 09:40:25

      (4)打印上个星期此时的时间戳strtotime("-1 week")
      当前时间:
      echo date("Y-m-d H:i:s",time())
      结果:2009-01-22 09:40:25
      指定时间:
      echo date("Y-m-d H:i:s",strtotime("-1 week"))
      结果:2009-01-15 09:40:25

      (5)打印指定下星期几的时间戳strtotime("next Thursday")
      当前时间:
      echo date("Y-m-d H:i:s",time())
      结果:2009-01-22 09:40:25
      指定时间:
      echo date("Y-m-d H:i:s",strtotime("next Thursday"))
      结果:2009-01-29 00:00:00

      (6)打印指定上星期几的时间戳strtotime("last Thursday")
      当前时间:
      echo date("Y-m-d H:i:s",time())
      结果:2009-01-22 09:40:25
      指定时间:
      echo date("Y-m-d H:i:s",strtotime("last Thursday"))
      结果:2009-01-15 00:00:00

    以上示例可知,strtotime能将任何英文文本的日期时间描述解析为Unix时间戳,我们结合mktime()或date()格式化日期时间获取指定的时间戳,实现所需要的日期时间。

    展开全文
  • 1、从键盘输入一个月份,屏幕上输出本年这个月的月历,每星期一行,从星期日开始,到星期六结束; 2、从键盘输入一个日期,屏幕上回答是星期几; 3、从键盘输入两个日期,计算这两个日期之间含有多少天。 import ...
  • 比如说要统计上个月的数据,则需要知道上个月开始时间和结束时间! php要获取时间需要用到的函数:time(), date(),strtotime(),等等 strtotime()是一个功能比较强大的函数,可以很方便的获取到我们想要的时间戳,...
  • 计算星期几的公式

    千次阅读 2012-11-20 22:34:14
    如何计算某一天是星期几? —— 蔡勒(Zeller)公式  历史上的某一天是星期几?未来的某一天是星期几?关于这问题,有很多计算公式(两通用计算公式和一些分段计算公式),...m:(m大于等于3,小于等于14,
  • 最近笔者在开发一报表功能时,客户要求报表生成的时间可以自己制定,也就是说我们系统需要提供一或两日期的文件框(如果是日报表就一,如果是周或或年报表就需要两)给客户自己填写。除此之外,客户还...
  • 如何快速算出一日期是星期几

    万次阅读 2007-11-19 21:16:00
    最常见的公式:(如果你觉得很烦,看公式就可以了) W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D Y是年份数,D是这一天在这一年中的累积天数,也就是这一天在这一年中是第天。 最好用的是蔡勒公式: W = ...
  • 计算在1901年11日至2000年1231日间共有多少个星期天落在每的第一天上
  • 计算任意指定公元日期总天数及星期几,查询输出日历到记事本的追加及覆盖.微软农历文档 此 Windows 窗体应用程序演示如何将动画图像绘制到屏幕。 VS组件管理器NuGet Package Manager for Visual Studio 2013 c++ ...
  • 如何计算某一天是星期几

    千次阅读 2014-09-22 15:45:12
    星期制度是一种有古老传统的制度。据说因为《圣经·创世纪》中规定上帝用了六  天时间创世纪,第七天休息,所以人们也就以七天为一...指官员的工作每十日为一周期,第十日休假),但后来也采取了西方的星期制度。
  • 用JAVA计算星期几的算法

    千次阅读 2013-12-04 22:01:50
    由于我们现在的实际时间,是有相关机构不停的调整,所以JAVA默认用的Calendar对象算出来的时候不对,即使...先把算法贴出来,有心情看推理过程的同学可以往看,不想看的就把算法贴出来直接用就可以了。  public sta
  • Java计算日期在当月是第周背景Java LocalDate API每第1周一为该第一周的做法每1为第一周做法 背景 公司项目需求是统计周报,一开始我的做法是按每1开始为第一周统计周报,比如2020-05-01到2020-05-...
  • 通过Shell判断某个日期是星期几

    千次阅读 2014-03-07 10:39:53
    2. 然后每周六归档备份完毕后,把上周日到本周六的备份文件统一cp到一目录(/datafile/tarfile),然后把这目录gtar压缩打包,以当天日期命名比如:prod_yyyymmdd.tar.gz  3. 把prod_yyyymmdd.tar.gz传到...
  • C语言根据日期判断星期几(使用基姆拉尔森计算公式)算法如下: 基姆拉尔森计算公式W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7在公式中d表示日期中的日数,m表示月份数,y表示年数。注意:在公式中有与其他...
  • //基姆拉尔森计算公式根据日期判断星期几 void CalculateWeekDay(int y, int m,int d){ if(m==1||m==2) m+=12,y--; int iWeek = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; switch(iWeek){ case 0: printf("星期...
  • 入职工作3个月总结(心情)

    千次阅读 热门讨论 2018-07-31 17:21:12
    2018年416入职,到今天为止已经3个了,不知不觉,时间过得真快。在这里,本想抱怨一下的,后来想想,抱怨也没用,传递负能量,还不如谈一谈自己在三来的感受。  感受一:感觉自己被放空,干啥啥不会...
  • 巧算星期几 基姆。拉尔森 基姆拥有计算机学科的博士学位。他对数据库,算法和数据结构有着浓厚的兴趣。他的联系地址是 (原文 为丹麦文--译者注) 31,DK-5270,Odense N,Denmark,或发 E-mail 至 :...
  • 利用Date对象编写程序,判断并输出今天是开学的第几周,星期几。          (function(){  var startDay = new Date(2014,8,1); //根据指定的年月日时分秒设置开学时间为2014/09/01  var startMs = ...
  • C语言根据日期判断星期几(使用基姆拉尔森计算公式) 算法如下: 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y表示年数。 注意:在公式中有...
  • C语言根据日期判断星期几(使用基姆拉尔森计算公式) 算法如下:  基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y表示年数。 注意:在公式...
  • 今日看点✦微信安全团队发布个人帐号专项治理公告,严打违禁品售卖及网络欺诈✦ 怪兽充电正式递交赴美上市IPO招股书,冲击共享充电宝第一股✦ Keep就公众号内容“借鉴”其他公文章致歉:将...
  • 正确获取星期几(Calendar.DAY_OF_WEEK)

    千次阅读 2016-10-08 16:20:00
    而Java中Calendar.MONTH返回的数值其实是当前月距离第一个月有多少个月份的数值,JANUARY在Java中返回“0”,所以我们需要+1。 2. 在获取星期几 Calendar.DAY_OF_WEEK – 1 的原因 Java中Calendar.DAY_OF_WEEK...
  • 仔细观察的话,我们会发现除去1月和2月,3月到7月这五个月的剩余天数值是3,2,3,2,3;8月到12月这五个月的天数值也是3,2,3,2,3,正好是一个重复。相应的累积天数中, 后一月的累积天数和前一月的累积天数之差减去28...
  • 巧算星期几 基姆。拉尔森基姆拥有计算机学科的博士学位。他对数据库,算法和数据结构有着浓厚的兴趣。他的联系地址是 (原文为丹麦文--译者注) 31,DK-5270,Odense N,Denmark,或发 E-mail 至 :kslarsen@imada...
  • 到公司四个月的总结

    千次阅读 多人点赞 2013-08-14 20:16:03
    这是一篇迟到的博文,应该说是心得,本来月初就计划写的,但是由于最近项目很赶(几乎天天... 从3.1开始到公司实习,到现在也有4个月了(中间一个月回学校搞毕设),在这个四个月中,真的学到了非常多的东西,不管
  • 不查日历怎么知道任何一天是星期几作者:刘夙 2004-5-2 1:53:20 博客中国(Blogchina.com) 文/葛民勤---------------------------------------------------------------------------摘要: 最常见的公式:W = [Y...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,572
精华内容 26,228
关键字:

下个月3号星期几