1、多种日期时间格式
以下的日历表大家应该最熟悉不过了,我们经常在网络上查询日期,大多是如下格式显示的。
其中有两种日期格式
阳历:2020-1-17 10:48
农历:二零一九年腊月二十三
虽然阳历接近于国际化的格式,农历则是我们本土化的(localization,一些编程语言里包命名的时候经常携程I10n,为了方便书写)的习惯。
外国人需要思维转换一下才能看懂这个日期。
触类旁通:还有一些日期,受宗教及本土文化影响,偏本土化的,大家看起来比较费力,这在沟通上也不方便,例如泰历,日本历法,台湾省历法。
1、1泰历
在佛历2412年,泰国拉玛五世皇曾定4月1日为元旦日,后来直到西历1940年12月24日,多国与泰国政府协商,经慎重考虑以后,由当时的国务院长宣布,
从1941年起,改定西历1月1日为元旦日,并一直沿用至今。
1、1、1佛历换算公式:
佛历年-543年=公历年
公历年+543年=佛历
1、2日本历法
日本历是日本使用的历法,以前日本一直使用中国农历。使用中国的元嘉历、麟德历(在日本叫做仪凤历)、大衍历、五纪历、宣明历。之后,使用日本独自
作的贞享历、宝历历、宽政历、天保历。1868年明治维新后,于1873年废除天保历,改为使用格里历,废除旧历新年,但民间占卜、算命和春分上坟仍依照天保历。
1、2、1年号纪年
日本历和格里历的唯一不同是纪年法,日本仍然采用中国的帝位纪年法,每位新天皇即位更改年号,例如2008年是明仁天皇的“平成20年”。由于国际交往的增多,
在商业和外交上也使用公元纪年,但钱币印刷、公文来往仍然使用天皇年号。
1、2、2节句
从中国传入日本的节日叫做“节句”,古时遵从中国习惯,日期按农历计算,在日本把日期改到公历。
元旦 - 元旦/正月/元日。公历1月1日。
人日 - 七草の节句(七草节)。公历1月7日。
上巳 - 桃の节句(樱花节)/雏祭り(女儿节)。公历3月3日。
端午 - 端午の节句(端午节)/子供の日(儿童节)。公历5月5日。
七夕 - 七夕。公历7月7日。
重阳 - 菊の节句(菊花节)。公历9月9日。
1、2、3杂节
随从二十四节气的日本自己的节日叫“杂节”。
节分 - 立春前日。2月3日左右。
彼岸 - 包括春分、秋分的1个星期。
社日 - 春分、秋分最近的戊日。
八十八夜 - 从立春88天。5月2日左右。
入梅 - 太阳通过黄经80度的日子。6月11日左右。
半夏生 - 太阳通过黄经100度的日子。7月2日左右。
土用 - 一般只指夏土用。
春土用 : 从黄经27度到立夏(黄经45度)
夏土用 : 从黄经117度到立秋(黄经135度)
秋土用 : 从黄经207度到立冬(黄经225度)
冬土用 : 从黄经297度到立春(黄经315度)
二百十日 从立春210天。9月1日左右。
二百二十日 - 从立春220天。9月11日左右。
限于篇幅不再一一列举
1、3台湾省历法
台湾使用民国纪年,台湾时间日期计法有
西元年份减1911=民国纪年 西元纪年也会一并使用
公文使用国历
一般民间信仰会参考农民历做为行事依据
比如说民国70年,对应的西元时间是1981年
台历与各国、朝代计算方法:http://sinocal.sinica.edu.tw/
下面我们就来了解一下日期时间相关的规范和标准
2、RFC822
RFC822: Standard for ARPA Internet Text Messages(ARPA 互联网文本消息的标准),即电子邮件信息标准,主要是用于电子邮件格式的报文。
它包括两个主要的组成部分:邮件头和邮件体,以下是一段标准的报文:
例程1 test.eml
Return-Path: <[email protected]>
Delivered-To: [email protected]
Received: from smtp.sina.com.cn (unknown [202.108.3.177])
by sohumx139.sohu.com (Postfix) with SMTP id E4F9802C1249
for <[email protected]>; Thu, 10 Nov 2005 16:39:50 +0800 (CST)
Received: (qmail 49221 invoked from network); 10 Nov 2005 08:39: 33 -0000
Received: from unknown (HELO it315?test) (218.246.5.151)
by smtp.sina.com.cn with SMTP; 10 Nov 2005 08:39:33 -0000
From: [email protected]
To: [email protected]
subject:test
Message-Id: <[email protected]>
Date: Thu, 10 Nov 2005 16:39:50 +0800 (CST)
Status: RO
X-UIDL: 1131611863.21509_77.mx72
test!!!
如果使用Wireshark等工具抓过STMP包的朋友应该能比较熟悉这段报文(本篇文章不讲究邮件报文,主要讲日期时间)。
上面有好几段英文日期时间格式,对于英文一般或者不懂的朋友看起来费劲。
以下是不同语言处理RFC822日期时间的一些文章(有本人整理、翻译、摘录):
2、1 协议相关标准
2、1、1 语法:
日期时间 = [ 天 "," ] 日期 时间 ; dd笔者注:天为可选,可以不输入)
; hh:mm:ss zzz
天 = "Mon" / "Tue" / "Wed" / "Thu"
/ "Fri" / "Sat" / "Sun"
日期 = 2位数字 英文单词简写月 2个数字 ; 天 月 年
; 例如: 20 Jun 82
月 = "Jan" / "Feb" / "Mar" / "Apr"
/ "May" / "Jun" / "Jul" / "Aug"
/ "Sep" / "Oct" / "Nov" / "Dec"
时间 = 小时 时区 ; ANSI及军方标准
小时 = 2位数字 ":" 2位数字 [":" 2位数字] ; (笔者注:秒为可选,可以不输入)
; 00:00:00 - 23:59:59
时区 = "UT" / "GMT" ; 世界时间
; 北美时间 : UT
/ "EST" / "EDT" ; 东部时间: - 5 / - 4
/ "CST" / "CDT" ; 中部时间: - 6 / - 5
/ "MST" / "MDT" ; 山地时间: - 7/ - 6
/ "PST" / "PDT" ; 太平洋时间: - 8/ - 7
/ 1ALPHA ; 军方时间: Z = UT;
; A:-1; (J暂未使用)
; M:-12; N:+1; Y:+12
/ ( ("+" / "-") 4位数字) ; 表示具有时间的相对差异(笔者注:时区偏移)
; hours+min. (HHMM)
如果包括,则星期数必须是日期规范所隐含的日期。
时区可能以多种方式表示。"UT"是通用时间(以前称为"格林威治平均时间");
"GMT"允许作为世界时间的参考。军事标准对每个区域使用单个字符。
"Z"是通用时间。"A"表示提前一小时,"M"表示提前 12 小时;"N"是一小时后,而"Y"是 12。一个允许显式指示从 UT 的偏移量;
另一个使用常见的 3 字符字符串来指示北美的时区。
局限于笔者的英文能力,大家可以到https://www.w3.org/Protocols/rfc822/#z28了解详情。
2、1、2 MSDN:RFC 822: Date and Time Specification
本节定义了 RFC 822 消息中使用的日期和时间的语法和语义。例如,枚举一周中的天和一年中的几个月,
时间定义为:
time = hour zone ; ANSI and Military
hour = 2DIGIT ":" 2DIGIT [":" 2DIGIT] ; 00:00:00 - 23:59:59
时区格式:
zone = "UT" / "GMT"
/ "EST" / "EDT"
2、2 相关文章
C#.我该如何分析和转换日期时间的到RFC 822的日期,时间格式(How do I parse and convert DateTime’s to the RFC 822 date-time format?)
Convert a date to the RFC822 standard for use in RSS feeds(在RSS源中间日期转换成RFC822标准使用)
java RFC822中将字符串转成Date
RFC850
格式:星期几 "," 2位数天-英文月份简写-2位数年 time "GMT"
示例数据:Tue,03-Jul-1204:40:59GMT
RFC1036
格式:EEEEEEEEE, dd-MMM-yy HH:mm:ss z
示例数据:Sunday, 06-Nov-94 08:49:37 GMT
RFC1123
该协议日期时间格式的定义是RFC822的升级;相对于RFC822,将2位数年份改成4位数。
格式:DAY, DD MON YYYY hh:mm:ss GMT
示例数据:Sun, 21 Oct 2018 12:16:24 GMT
笔者理解:应该是在2000年出现以后,防止两位数年份防止产生错误/歧义
参考资料:
java中将RFC1123日期时间格式化
RFC1945
该协议规范并未对日期时间做出定义,只是引用了RFC协议中关于时间的定义
出于历史原因,HTTP/1.0应用允许三种格式来表示时间戳:
Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
第一种格式是首选的Internet标准格式,表示方法长度固定(RFC1123[6])。第二种格
式在普通情况下使用,但是它是基于已经废弃的RFC850[10]中的日期格式,而且年不是用
四位数字表示的。HTTP/1.0 客户端及服务器端在解析日期时可识别全部三种格式,但是它
们不可以产生第三种时间格式(asctime) 。
注意:对于接收到由非HTTP应用产生的日期数据时,提倡对接收到的日期值进行填充。
这样做是因为,在某些时候,代理或网关可能通过SMTP或NNTP来获取或发送消息。
所有的HTTP/1.0 date/timp时间戳必须用世界时间(Universal Time,UT),即格林威治
时间来表示(Greenwich Mean Time,GMT),没有任何修改的余地。前面的两种格式用了
“GMT”表示时区,在读ASC表示的时间时,也应假定是这个时区。
HTTP-date = rfc1123-date | rfc850-date | asctime-date
rfc1123-date = wkday "," SP date1 SP time SP "GMT"
rfc850-date = weekday "," SP date2 SP time SP "GMT"
asctime-date = wkday SP date3 SP time SP 4DIGIT
date1 = 2DIGIT SP month SP 4DIGIT
; day month year (e.g., 02 Jun 1982)
date2 = 2DIGIT "-" month "-" 2DIGIT
; day-month-year (e.g., 02-Jun-82)
date3 = month SP ( 2DIGIT | ( SP 1DIGIT ))
; month day (e.g., Jun 2)
time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
; 00:00:00 - 23:59:59
wkday = "Mon" | "Tue" | "Wed"
| "Thu" | "Fri" | "Sat" | "Sun"
weekday = "Monday" | "Tuesday" | "Wednesday"
| "Thursday" | "Friday" | "Saturday" | "Sunday"
month = "Jan" | "Feb" | "Mar" | "Apr"
| "May" | "Jun" | "Jul" | "Aug"
| "Sep" | "Oct" | "Nov" | "Dec"
注意:HTTP要求只能在协议流中使用data/time时间戳格式,不要求客户端及服务
器端在用户描述、请求登录等情况下使用这类格式。
摘自:超文本传输协议 -- HTTP/1.0
组织:中国互动出版网(http://www.china-pub.com/)
RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm)
E-mail:[email protected]
译者:黄晓东(黄晓东 [email protected])
RFC2822
RFC3339
RFC7231
According to the RFC 7231, HTTP dates must be expressed in GMT. So expressing dates with offsets from UTC don't seem to be valid valid.
HTTP日期必须用GMT表示,UTC偏移量表示日期似乎无效了。
参考:https://stackoverflow.com/questions/54927845/what-is-valid-rfc1123-date-format