zoukankan      html  css  js  c++  java
  • 计算周数的方式

    有很多地方需要用到“周”这个数字,日常办公可以使用excel的函数获取,软件开发可以使用自带的函数获取。其实我们从未关心过,我们获取到的周是如何计算的,计算的值,真的是正确的吗?或者说真的是你想要的吗?

    前些日子,因为“周”这个数字计算失误,与客户其他系统不一致,产生了疑问。那么接下来,我就将近期收集到的资料,描述一下。

    周的计算,目前有3种方式:

    1、每年的1月1日(也就是第1天)所在的周,为第1周。

    2、每年的第1个完整周(也就是周一到周天必须在1年内)所在的周,为第1周。

    3、ISO8036标准,本年度第1个星期四所在的星期,为第1周。

    经过测试,发现华为荣耀手机日历,是按照 第1种方法算的。而小米手机则是按照第2种计算方法。第3种方法,暂时没找到用处。

    OK,接下来是正题,如何计算。

    方式一、适用于程序开发,C#语言调用微软的System.Globalization的方法

    private static string GetWeekOfYear(DateTime dt)
    {
        System.Globalization.GregorianCalendar gc = new System.Globalization.GregorianCalendar();
        int weekOfYear = gc.GetWeekOfYear(dt, System.Globalization.CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday);
    
        return weekOfYear.ToString().PadLeft(2, '0'); ;
    }

    重点内容是 “GetWeekOfYear”这个函数。

    第1个参数是日期

    第2个参数:表示用哪种方式计算。目前有3种:FirstFourDayWeek,FirstDay,FirstFullWeek(对应上述我说的几种)

    第3个参数表示以哪一天作为周的第一天

    下面附录一份计算年的算法(无非就是针对1月份的日期,判断年份是否减1的操作):

     1 // 针对以第1个完整周为第1周的情况下,计算年份
     2 private static int GetYear(DateTime dt)
     3 {
     4     int y = dt.Year;
     5     int m = dt.Month;
     6     int nWeek = int.Parse(GetWeekOfYear(dt));
     7     if (m == 1 && nWeek > 40)
     8     {
     9         y = y - 1;
    10     }
    11     return y;
    12 }

    根据国人的计算方式:

     1 但是这种方式同样也是按中国的日期计算方式,当需要使用sql server 的函数DATEPART
     2 
     3 筛选数据的时候,两个又矛盾了,下面才是终极解决方案:
     4 
     5 public static int WeekOfYear(DateTime dt, CultureInfo ci)
     6         {
     7             return ci.Calendar.GetWeekOfYear(dt, ci.DateTimeFormat.CalendarWeekRule, ci.DateTimeFormat.FirstDayOfWeek);
     8         }
     9 
    10 调用方法:WeekOfYear(DateTime.Now, new CultureInfo("zh-CN"));
    View Code

    方式二、Excel计算(办公常用)

    函数1:WEEKNUM (按照上述第1种计算方法计算周数)

    参考:https://www.wps.cn/learning/course/detail/id/171.html

    函数2:第2中计算方式,未找到-_-|| 。如果后续知道了,会继续更新。

    函数3:ISOWEEKNUM (按照上述第3种方式计算周数,WPS中不存在,只能按照周一为每周第1天计算)

    参考:https://support.microsoft.com/zh-cn/office/isoweeknum-%e5%87%bd%e6%95%b0-1c2d0afe-d25b-4ab1-8894-8d0520e90e0e?ui=zh-cn&rs=zh-cn&ad=cn#top

    我没有时间去整理更多语言的使用方法,大家有兴趣的可以自行研究一下。

  • 相关阅读:
    golang-uuid
    golang-random随机数
    git status检测不到文件变化
    vimium
    go1.11新特性,mark一下
    HTML网页滚动加载--mark一下
    docker-清理none镜像等操作
    golang websocket
    postman 快捷方式--启动图标
    tmux基本操作
  • 原文地址:https://www.cnblogs.com/qyfh/p/CalcWeekNum-Method.html
Copyright © 2011-2022 走看看