Skip to content

Commit 8f8d07d

Browse files
Merge pull request #104 from cpprefjp/normalize
最終更新日時を正規化
2 parents df9f137 + 3c62598 commit 8f8d07d

2 files changed

Lines changed: 52 additions & 4 deletions

File tree

boostjp/templates/content.html

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,15 +92,39 @@
9292
{% if latest_commit_info %}
9393
<p class="text-right"><small>
9494
最終更新日時:
95-
<span itemprop="datePublished" content="{{ latest_commit_info['last_updated'].strftime('%Y-%m-%dT%H:%M:%S%z') }}">
95+
<time itemprop="datePublished" class="js-local-time"
96+
datetime="{{ latest_commit_info['last_updated'].isoformat() }}">
9697
{{ latest_commit_info['last_updated'].strftime('%Y年%m月%d日 %H時%M分%S秒') }} (JST)
97-
</span>
98+
</time>
9899
<br/>
99100
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
100101
<span itemprop="name">{{ latest_commit_info['last_author'] }}</span>
101102
</span>
102103
が更新
103104
</small></p>
105+
<script>
106+
(function () {
107+
// 最終更新日時を閲覧者のローカルタイムゾーンで表示し直す (issue #53 の正規化)。
108+
// JS が無効な環境ではサーバ生成の JST 表記がそのまま残る。
109+
function pad(n) { return (n < 10 ? '0' : '') + n; }
110+
var els = document.querySelectorAll('time.js-local-time[datetime]');
111+
for (var i = 0; i < els.length; i++) {
112+
var el = els[i];
113+
var d = new Date(el.getAttribute('datetime'));
114+
if (isNaN(d.getTime())) { continue; }
115+
var tz = '';
116+
try {
117+
var parts = new Intl.DateTimeFormat(undefined, { timeZoneName: 'short' }).formatToParts(d);
118+
for (var j = 0; j < parts.length; j++) {
119+
if (parts[j].type === 'timeZoneName') { tz = parts[j].value; break; }
120+
}
121+
} catch (e) {}
122+
el.textContent = d.getFullYear() + '年' + pad(d.getMonth() + 1) + '月' + pad(d.getDate()) + '日 '
123+
+ pad(d.getHours()) + '時' + pad(d.getMinutes()) + '分' + pad(d.getSeconds()) + '秒'
124+
+ (tz ? ' (' + tz + ')' : '');
125+
}
126+
})();
127+
</script>
104128
{% endif %}
105129
{% endblock %}
106130

cpprefjp/templates/content.html

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,39 @@
102102
{% if latest_commit_info %}
103103
<p class="text-right"><small>
104104
最終更新日時:
105-
<span itemprop="datePublished" content="{{ latest_commit_info['last_updated'].strftime('%Y-%m-%dT%H:%M:%S%z') }}">
105+
<time itemprop="datePublished" class="js-local-time"
106+
datetime="{{ latest_commit_info['last_updated'].isoformat() }}">
106107
{{ latest_commit_info['last_updated'].strftime('%Y年%m月%d日 %H時%M分%S秒') }} (JST)
107-
</span>
108+
</time>
108109
<br/>
109110
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
110111
<span itemprop="name">{{ latest_commit_info['last_author'] }}</span>
111112
</span>
112113
が更新
113114
</small></p>
115+
<script>
116+
(function () {
117+
// 最終更新日時を閲覧者のローカルタイムゾーンで表示し直す (issue #53 の正規化)。
118+
// JS が無効な環境ではサーバ生成の JST 表記がそのまま残る。
119+
function pad(n) { return (n < 10 ? '0' : '') + n; }
120+
var els = document.querySelectorAll('time.js-local-time[datetime]');
121+
for (var i = 0; i < els.length; i++) {
122+
var el = els[i];
123+
var d = new Date(el.getAttribute('datetime'));
124+
if (isNaN(d.getTime())) { continue; }
125+
var tz = '';
126+
try {
127+
var parts = new Intl.DateTimeFormat(undefined, { timeZoneName: 'short' }).formatToParts(d);
128+
for (var j = 0; j < parts.length; j++) {
129+
if (parts[j].type === 'timeZoneName') { tz = parts[j].value; break; }
130+
}
131+
} catch (e) {}
132+
el.textContent = d.getFullYear() + '年' + pad(d.getMonth() + 1) + '月' + pad(d.getDate()) + '日 '
133+
+ pad(d.getHours()) + '時' + pad(d.getMinutes()) + '分' + pad(d.getSeconds()) + '秒'
134+
+ (tz ? ' (' + tz + ')' : '');
135+
}
136+
})();
137+
</script>
114138
{% endif %}
115139
{% endblock %}
116140

0 commit comments

Comments
 (0)