13号星期五和日期时间方法

今天是星期五,十三号。在世界上许多地方,今天被认为是不幸的.但我想重提一个老问题:今天是不是不太可能?每个月的13号是星期五的几率有多大?计算答案使用了一个新的MATLAB®特性,datetime方法

几年前,我在一篇博客文章中提到了13号星期五,克利夫角,13号星期五.今天我将重复使用那篇文章的一部分。

内容

闰年

闰年使我们的历法成为一个重要的数学对象。这个匿名函数可以实现闰年规则。

闰年=@(y)mod(y,4)==0&mod(y,100)~=0|mod(y,400)==0;

这就是说,闰年每四年发生一次,除非世纪之交不能被400整除。试试几年的数字。

Y = [2018 2020 2000 2100]';Isleap = [y leapyear(y)]
Isleap = 2018 0 2020 1 2000 1 2100 0

因此,今年不是闰年,下一个是2020年。世纪之交的2000年是闰年,但2100年不会。

日历

闰年规则意味着我们的历法有400年的周期。2000至2399年的日历将在2400至2799年重用。在400年的周期中,有97个闰年、4800个月、20871个星期和146097天。所以日历年的平均天数不是365.25天,而是

dpy = 365 + 97/400
dpy = 365.2425

我们可以通过计算在4800个月里发生了多少次,来计算每月的13号是周五的概率。正确的概率是这个数除以4800。因为4800不是7的倍数,所以概率不会减少到1/7。

Datenum

多年来,涉及日期和时间的计算都是使用一大堆函数来完成的。

  • 时钟
  • datenum
  • datevec
  • datestr
  • dateticks
  • 现在
  • 工作日

这些功能很好地为我们服务,但它们有一些重大缺点。它们不是特别容易使用。显示格式有限。的浮点精度datenum有效地限制了工期的计算。目前还没有退休的计划datenum以及它的朋友们,但现在有了更可取的东西。

Datetime

datetime对象,在R2014b中引入,将这些函数组合并扩展为一个。

  • datetime

文档datetime可在线获取,或通过命令从MATLAB中获取

医生datetime

例如,这是我发表这篇文章的日期和时间。

d = datetime (“现在”
d =日期时间13- 4 -2018 21:21:19

我可以使用指定自定义显示格式

d = datetime (d,“格式”'eeee, MMMM d, yyyy HH:mm:ss'
日期:2018年4月13日星期五21:21:19

可用的显示格式包括对国际标准的支持,金宝appISO 8601

纳秒

datetime的方法比datenum他永远也不可能成为。试试这个

hms=日期时间(d,“格式”“HH: mm: ss。瑞士的
HMS = datetime 21:21:19.502

我们可以看到,d将小数秒移到小数点后至少三位。纳秒呢?

Secperday = 24*60*60纳米= 1。e9 /secperday HMS = datetime(d,“格式”“HH: mm: ss。SSSSSSSSS”hmsplusnano = HMS + nano
Secperday = 86400 nano = 1.1574e-14 HMS = datetime 21:21:19.50200000 hmsplusnano = datetime 21:21:19.502000001

一纳秒比的舍入误差小四个数量级datenum在这个时代。比较

Nano epsofdatenum = eps(日期enum(d))
Nano = 1.1574e-14 epsofdatenum = 1.1642e-10

我很高兴在这里透露一些关于算术的细节datetime.这个物体使用的是一种四倍精度的形式两双.实际上,112位格式的后半部分被存储为数据字段,如下所示。

disp (struct (hmsplusnano))
警告:对对象调用STRUCT可防止对象隐藏其实现细节,因此应避免。使用DISP或DISPLAY查看对象的可见公共详细信息。有关详细信息,请参阅“帮助结构”。UTCZoneID:'UTC'UTCLeapSecsZoneID:'UTCLeapSeconds'ISO8601Format:'UUU MM dd'T'HH:MM:ss.SSS'Z''epochDN:719529个月:[1×1 struct]DaysOfWeek:[1×1 struct]日期字段:[1×1 struct]noconstructor参数应用:[1×1 struct]数据:1.5237e+12+1.0000e-06i fmt:'HH:MM:ss.SSS'tz:'isDateOnly:0

预期的

的摘要描述datetime文档描述了对象的一些重要特性,该对象定义了近100个方法。

datetime数组使用预期的ISO日历表示时间点。datetime值具有灵活的显示格式,精度可达纳秒,可以考虑时区、夏令时和闰秒。

我得查一下"有希望的"的定义。在这方面,它意味着日历可以向后延长,以适用于甚至在它被通过之前的日期。

Vectorize

我们继续13号星期五吧。和MATLAB中的大多数东西一样datetime与向量。的语句

y = 2000;m = 1:4800;t = 13;v = datetime (y、m、t);

生成4800的行向量datetime每个月的13号。前几个和后几个是

流(“%s”v(1:4))流(“……\ n”)fprintf(“%s”, v (end-3:结束)
2000年1月13日2000年2月13日2000年4月13日…13- 9 -2399 13- 10 -2399 13- 11 -2399 13- 12 -2399

该声明

w =工作日(v);

产生4800个燧石的行向量,位于1(用于周日)和7(用于周六)之间。前几个和后几个是

流(“% 3 d”w(1:4))流(' ...')fprintf(“% 3 d”, w (end-3:结束)
5 1 2 5…2 4 7 2

现在要算出工作日的数目,我们只需要

c = histcounts (w)
C = 687 685 685 687 684 688 684

这就对了。星期五的数字是688,比一周中的任何一天都要高。任何一个月的第13天都有可能是星期五。

的概率是

p = c / 4800
P = 0.1431 0.1427 0.1427 0.1431 0.1425 0.1433 0.1425

将这些值与平均值进行比较,1/7 = 0.1429.4个概率低于平均值,3个概率高于平均值。

分类

让我们用a将计数与一周的天数配对明确的变量,在R2013b中引入。

c =分类(w, 1:7, {“太阳”“我的”“星期二”“结婚”“星期四”“星期五”“Sat”});总结(c)
星期一星期二星期三星期四星期五星期六687 685 687 684 688 684

当我们绘制直方图时,x轴上提供了适当的标签。13号星期五是赢家。

直方图(c)集(gca,“ylim”690年[680])标题(“工作日计算,400年”

谢谢

感谢MathWorks的Peter Perkins。在这个岗位上,我从他身上学到了很多。




发布与MATLAB®R2018a

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。