• DateTime类型的一个Bug


    先说一个历史故事,关于我们现在的阳历:

    现行的公历是格利戈里历法,这个历法的是1582年教皇格利戈里根据恺撒大帝引进的算法改进的。它采用的是闰年制也就是现行的制度,不过有一个需要注意的地方就是,这个历法并不是连续的,中间缺少了11天。1752年9月2日之后的那一天并不是1752年9月3日,而是1752年9月14日。也就是说,从1752年9月3日到1752年9月13日的11天并不存在。抹掉这11天是由英国议会做出的决定。所以要计算某年每个月的天数的,除了要考虑是否是闰年以外,还要考虑1752年的9月

    详细的情况可以查wiki百科:http://en.wikipedia.org/wiki/Gregorian_calendar

    网上也有很多文章说这个事情。

    于是我写了一段代码,测试.net framework提供的api,看看里面的datetime类是不是按这个历法写的:

    class Program
    {
        
    static void Main(string[] args)
        {
            DateTime t 
    = new DateTime(175291);
            
    int month = t.Month;
            
    while (month == t.Month)
            {
                Console.WriteLine(t.Year 
    + "-" + t.Month + "-" + t.Day);
                t 
    = t.AddDays(1);
            }
            Console.Read();
        }
    }

    编译运行之后,结果发现:

    1752-9-1
    1752-9-2
    1752-9-3
    1752-9-4
    1752-9-5
    1752-9-6
    1752-9-7
    1752-9-8
    1752-9-9
    1752-9-10
    1752-9-11
    1752-9-12
    1752-9-13
    1752-9-14
    1752-9-15
    1752-9-16
    1752-9-17
    1752-9-18
    1752-9-19
    1752-9-20
    1752-9-21
    1752-9-22
    1752-9-23
    1752-9-24
    1752-9-25
    1752-9-26
    1752-9-27
    1752-9-28
    1752-9-29
    1752-9-30

    从3号到13号的日期仍然是存在的,这是不符合实际历法的。

    既然测试了.net,就把java的sdk也试试吧,于是写了一个java代码:

    import java.util.*;

    public class CalendarTest
    {
        
    public static void main(String[] args)
        {
            Calendar ca 
    = Calendar.getInstance();//get instance of GregorianCalendar
            ca.set(Calendar.YEAR, 1752);
            ca.set(Calendar.MONTH, 
    9);
            ca.set(Calendar.DAY_OF_MONTH, 
    1);
            
            
    int month = ca.get(Calendar.MONTH);
            
    while (month == ca.get(Calendar.MONTH))
            {
                System.out.println(ca.get(Calendar.YEAR) 
    + "-" + ca.get(Calendar.MONTH) + "-" + ca.get(Calendar.DAY_OF_MONTH));
                ca.add(Calendar.DAY_OF_MONTH, 
    1);
            }
        }
    }

    编译运行:

    Code

    java提供的api也不对。

    这就是说,假如我们要写一段程序,计算乾隆皇帝登基当皇帝距今有多少天,无论是用java还是.net,都要自己写一个新的Calendar类了。

  • 相关阅读:
    Luogu P4053 [JSOI2007]建筑抢修
    CF894E Ralph and Mushrooms
    Boruvka
    Codeforces Beta Round #25 (Div. 2 Only) C. Roads in Berland
    HDU 3714/UVA1476 Error Curves
    HDU 5410 CRB and His Birthday
    HDU 1796 How many integers can you find
    UVA 11624 Fire!
    POJ 3279 Dungeon Master
    POJ 1321 棋盘问题
  • 原文地址:https://www.cnblogs.com/lane_cn/p/1496383.html
Copyright © 2020-2023  润新知