以下是 Ty Strong 的客座文章。Ty 注意到 CSS-Tricks 上关于<time>
元素的信息非常少,我同意他的观点。不能让这种情况发生!Ty,请开始吧。
HTML 中的<time>
元素表示机器可读的日期、时间或持续时间。它可用于创建事件调度、存档和其他基于时间的函数。WordPress 在默认主题中使用 time 元素。Reddit 也使用 time 元素。

<time>
元素显示帖子日期。简史
time 元素经历了一段曲折的历程。它于 2009 年被添加到 HTML5 规范中。两年后的 2011 年,该规范被删除,并被一个更广泛的元素<data>
替换。同年晚些时候,time 元素又重新添加回来,并具有一些改进的功能。
请放心,您可以使用它!
Bruce Lawson 对此情况进行了很好的概述:消失,回归,现在。HTML 历史上一个经典的“铺设牛路”时刻。
标签和属性
Time 只是一个 HTML 标签。以下是一个表示 2011 年 11 月的简单示例
<time>2011-11</time>
其中的文本恰好是一个有效的datetime
属性值(稍后将详细介绍)。但它不必如此。您可以将该文本移动到datetime
属性中并使用不同的文本。
<time datetime="2011-11">A cold winter month many years ago</time>
datetime
属性使 time 元素独一无二。它以机器可读的格式表示您正在表示的任何文本的日期、时间或持续时间。这意味着它是为计算机准备的,而不是为人类准备的,因此它具有非常具体的格式。
对于人类可读版本,可能更常见的是仅使用日期时间的文本表示形式
<time datetime="2011-11">November, 2011</time>
10 种方式
有多种标准方法可以格式化datetime
属性。
年和月
2014-06
非常简单。年份在月份之前。
日期
1969-07-16
年份、月份,然后是日期。
无年份日期
12-31
月份在日期之前。
仅时间
14:54:39.929
小时、分钟,然后是秒。秒是可选的。秒的分数可以表示到三位小数。
日期和时间
2013-11-20T14:54
日期和时间的组合,用大写字母 T 分隔。大写“T”可以用空格代替。
时区偏移量
+06:00
以加号或减号开头。冒号 (:) 是可选的。+00:00 或 UTC 时间可以用大写字母“Z”表示。
本地日期和时间
2019-12-31T23:59:59-02:00
这与日期和时间相同,只是添加了时区偏移量。同样,“T”可以用空格代替。
年和周
2010-W21
年份后跟大写字母“W”以及相应的周数。
仅年份
1776
这必须是四位或更多位数字,因此0001
和12345
都可以。
持续时间(方法一)
P2DT2H30M10.501S
大写字母“P”,一个可选的日期值,大写字母“T”,然后是可选的小时、分钟和秒的值。所有字母都必须是大写。
持续时间(方法二)
1w 2d 2h 30m 10.501s
周 (w)、日 (d)、时 (h)、分 (m) 和秒 (s)。字母可以是大写或小写。空格是可选的。
示例
Google released Gmail Blue on <time datetime="2013-04-01">April 1st, 2013</time>.
The Chelyabinsk meteor entered Earth's atmosphere over Russia on <time datetime="2013-02-15T09:20+06:00">15 February 2013 at about 09:20 YEKT (03:20 UTC)</time>.
The Apollo 13 mission lasted a total of <time datetime="5d 22h 54m 41s">5 days, 22 hours, 54 minutes, and 41 seconds</time>.
日期时间格式化遇到问题?
使用这个小工具,您可以输入特定的日期或时间(或两者),它将输出正确的日期时间值。
查看 Chris Coyier 编写的 CodePen 上的 Datetime Creator Tool (@chriscoyier) 。
浏览器支持
对于 `
不过,与 `
<p>The concert took place on <time datetime="2001-05-15 19:00">May 15</time>.</p>
<script>
var time = document.getElementsByTagName("time")[0];
console.log(time.dateTime);
// outputs "2001-05-15 19:00"
</script>
这仅在 Firefox 中受支持,而且也不是特别有用,因为它只返回该属性(如果属性不存在但文本是有效值,它甚至不会返回一个值,这似乎是有意义的)。
使用 `
我将再次引用 Bruce,因为他曾在 HTML5 Doctor 的一篇帖子 中非常出色地表达了这一点。
在网页中使用明确的日期并不难想象。浏览器可以提供将事件添加到用户日历的功能。一个泰国本地化的浏览器可以提供将公历日期转换为泰国佛教纪元日期的功能。一个日本浏览器可以将
<time>16:00</time>
本地化为“16:00时”。内容聚合器可以生成事件的视觉时间线。搜索引擎可以生成更智能的搜索结果。例如,在英国最近的大雪中,我搜索了我们镇的学校停课情况,发现我孩子的学校停课了。在接到学校的电话询问我的孩子在哪里后,我重新检查了网页。在页面底部的细小印刷体中,写着“发布日期:2008年1月5日”。我预计搜索引擎运营商会在与当前事件相关的搜索中,对更新的页面给予更高的排名。
其他细节
您可以对 `
- 一种友好的易读的显示格式
- 一种更详细的易读的悬停格式
- 一种机器可读的格式
这在 CodePen 上使用。

这是输出这些不同格式的 Rails 代码(STRFTIME 是一个很好的工具)。
<time
datetime="<%= @pen.created_at.strftime("%Y-%m-%dT%H:%M") %>"
title="<%= @pen.created_at.strftime("%Y-%m-%d at %I:%M %p") %>">
<%= @pen.created_at.strftime("%B %d, %Y") %>
</time>
您在任何项目中使用 `
这是一个不错的原生组件,但它仅适用于 Chrome,在 Firefox 中不受支持。
来源: http://html5test.com/
我不确定您在哪里看到这一点,但根据 caniuse,它与每个主要浏览器兼容(如果您不考虑 IE8)。有趣的是,MDN 似乎认为它在 Chrome 中不受支持。
无论浏览器是否在技术上支持该元素,`
我已根据 caniuse 更新了 MDN 文章,正在等待审核。
我是否应该将其与相对时间一起使用?如果是,我想完整的日期应该在属性中。
是的,您可以将其与大多数相对时间一起使用。对于一天中的时间,您可以简单地省略时区偏移量。对于日期,您可以选择更广泛的范围,例如某个星期、一个月或一年。例外情况是指定诸如“18世纪的某个时候”之类的内容。
感谢您的澄清,Ty。`
使用它让我感到困扰的一件事是,此标记无法验证。
我在 w3.org 验证器上收到以下错误,这可能是错误的。
我不确定它正在寻找什么“范围”,但快速搜索 Google 并没有结果。
2013年8月31日与 2013-09-31 不同。
2013-09-31 是 2013年9月31日,这一天不存在。
YEAR-MONTH-DATE 是正确的格式。
没有 2013-09-31,只有 2013-09-30。
哈!Mathis 完全正确。2013年没有8月31日!在页面上随意放置日期真是太糟糕了。
谢谢,Mathias!
确实有8月31日。但是没有9月31日。
我之前在实施 Microformats 的项目中使用过 `
但现在,我们可以像这里所示的那样使用 `
感觉更正确了。
嗯,评论解析器不喜欢在括号中使用 `
很好的解释!我们在重新设计 TechCrunch 时使用了 `` 元素。
非常有益。要收集所有这些关于这个(相当不常见)元素的信息并不容易。
我有时会使用它,但我主要开发不受搜索引擎索引的 Web 应用程序,因此它的作用很弱。对我来说,最糟糕的部分是 IE8 及更低版本无法在没有旧的 html5-shiv 技巧的情况下对其进行样式化。所以要注意。
随着我们在构建网页时改进标记,它变得越来越复杂,也越来越具体。然后在此之后,还有 schema.org 的微格式……
很好的解释!我一直在 WordPress 网站的所有帖子日期中使用 ``,并且我使用 PHP 输出 `datetime` 属性,如下所示:
the_time( 'c' )
。阅读完这篇文章后,我仍然无法看出以下两者的区别:
2013年4月1日
以及
2013年4月1日
有这个……
但是,这很容易做到,例如
2013年4月1日
所以,问题是,为什么需要另一个标签,而不是仅仅使用一个类?
如何编辑评论?:-/
Chris C. 注意:[内联代码] 代码按钮在输出中不起作用。没有显示代码,而是被解析为 html :-/
区别?
<time datetime=”2013-04-01″>2013年4月1日</time>
…
<span data-datetime=”2013-04-01″ class=”time”>2013年4月1日</span>
从技术上讲,您可以使用
<div>
标签来表示段落、粗体文本、列表项和按钮。虽然您可以这样做,但还有更好、更具体的标签可以使用。恢复time
标签而不使用通用data
标签的部分原因是为了拥有一个更具体的标签,专门用于日期、时间和持续时间。希望这有帮助!感谢这篇文章,Ty!
我必须承认,我并不真正了解“元素的使用,所以感谢你写了这篇文章!我希望它能让人们更好地理解这个元素的使用,就像对我一样!
精彩的文章,Ty。您是否有其他关于正确使用它的建议,以用于SEO实践?是否还有其他需要注意的事项,或者这就是全部方法?
再次祝贺!
谢谢!搜索引擎已经开始(或即将开始)使用time标签来帮助查找最近发布的文章,并将其排名更高。这在您首次发布文章时可能会有所帮助,但如果您的文章很旧,以后可能会对您不利。让您的文章排名更高的一个想法是在您的页面中添加类似以下内容:“文章最后更新于_time标签_”。
我喜欢使用<time>来改进对时间敏感查询(例如天气更新、体育更新、灾难更新等)的搜索结果的想法,但我可以看到这很快就会变得糟糕。有什么可以阻止某人在他们的页面上放置一个小脚本,每次页面加载时都输出当前日期和时间?
为了可访问性和语义?这个元素很棒。
为了SEO?希望有一天,但现在它还没有准备好。
很棒的文章,Ty。
我有一个问题,如果您想显示类似:2天前的内容,该怎么做?
谢谢
只有在您有具体的日期、时间或持续时间时才使用time元素。否则不要使用time元素。
@Mathias,虽然同时<time>元素可以将具体的日期、时间或持续时间添加到像2天前这样模糊的内容中。
@Patricio,您可以像这样标记它…
是的,这是真的。但只有在您知道此特定日期时才有可能。
例如:如果您想参加测试,您必须提前2天登录。
@James感谢您的评论。
@Mathias这是一个非常好的观点。
非常感谢。
pubdate属性怎么样?
属性
pubdate
已被WHATWG和W3C规范删除。早在2011年,当time
元素重新出现时,pubdate
并没有随之回归。我总是对博客发布日期使用
time
。 我目前的博客使用Jekyll,这使得它非常容易<time class=”meta” datetime=”{{ page.date }}”>{{ page.date | date_to_string }}</time>
(如果您愿意,可以查看源代码,它是开源的。我从此文件中获取了该代码段)
感谢Ty澄清这一点。
我假设情况就是这样。
<time>
标签确实是一个重要的标签,我们很多人很容易忽略它。感谢这篇文章。我相信我们很多人以后都会记得使用time标签。很棒的文章,Ty。
我有一个问题,如果您想显示类似:2天前的内容,该怎么做?
谢谢