参考:『Format personnalisé de la date』 Blogger Code
https://bloggercode-blogconnexion.blogspot.com/2017/04/date-operator.html
※ 2018 年 12 月 24 日現在、上記URLのサイトは閉鎖されています。Blogger のテーマを作る上でたいへん参考になるサイトなのですが、閉鎖の原因となった違法コピーが web 上から無くなったら再開するとのことなので、現在のところはリンク切れですが再開を願ってリンクを残します。
※ 2018 年 11 月 7 日現在、 format 演算子は使用しないほうがいいかもしれません。記事の中でも述べていますが、ブログの設定で行ったタイムゾーンが反映されておらず、グリニッジ標準時で計算してしまうようで、結果が 9 時間ズレてしまいます。
format 演算子って?
Blogger にはいろんな形式のデータが存在するのですが、その中に「DATE」という日付を示す型があります。そのDATE型のデータを指定の書式で文字に変換してくれるのが format というものです。例として、投稿日時のリストを出力してみます。毎月20日に投稿した場合のテスト用ブログを作り、次のようなコードをブログガジェットに埋め込んでみました。
<b:loop values='data:posts' var='post'>
<b:eval expr='data:post.date format "yyyy 年 M 月 d 日"'/><br/>
</b:loop>
format 演算子の使い方は、上記の <b:eval> タグ内の expr 属性を参照してください。 format の左側に変換したいデータ、右側に表示形式を文字列で指定します。このときの「yyyy」などのシンボルが年などの数値や文字列が入る場所を意味しており、 Blogger のサーバーはこのシンボルを見つけると数値や文字列に置き換えてくれます。上記のコードが出力する結果は以下のようになります。
2017 年 11 月 20 日
2017 年 10 月 20 日
2017 年 9 月 20 日
2017 年 8 月 20 日
2017 年 7 月 20 日
2017 年 6 月 20 日
2017 年 5 月 20 日
2017 年 4 月 20 日
2017 年 3 月 20 日
2017 年 2 月 20 日
2017 年 1 月 20 日
どういうときに使う?
Blogger の設定では日付の表示形式に英語圏向けの形式しか選べないことが多く、日本向けに作る場合はそういった部分もテーマの方で処理する必要があります。例えば、<b:skin> の中に表示形式を指定するための変数を定義しておいて……
<Variable name="datetimeformat.post" description="投稿の日付形式" type="string" default="yyyy 年 M 月 d 日 hh:mm"/>
その変数に値が入っていたら変換するように書き換えておきます。<b:loop values='data:posts' var='post'>
<b:eval expr='data:skin.vars.datetimeformat_post ? data:post.date format data:skin.vars.datetimeformat_post : data:post.date'/><br/>
</b:loop>
こうすれば、値が入ってなければ Blogger の設定通りの表示、そうでなければスキンのところに定義した値が表示されます。シンボルと出力結果
年
年を表すシンボルは西暦の数値に置き換えます。注意点として、小文字の yy や yyyy は年月日表記の年を表すのに対し、大文字の YY や YYYY は週番号表記の年を表します。たとえば、年月日表記での「2017年12月31日」は週番号表記での「2018年第1週の日曜日」と同じ日を指しています。このように、同じ日を指していても yyyy と YYYY は合致しないことがあります。週についての詳細は後述する「週番号」の項目を参照してください。
- yy
- 西暦の年の下二桁
- yyyy
- 西暦の年
- YY
- その日が属している週の、西暦の年の下二桁
- YYYY
- その日が属している週の、西暦の年
月
月を表すシンボルは、Mの数で出力する内容がいろいろ変わります。小文字の m や mm は時刻の分を表すシンボルなので、大文字小文字を間違えないようにしてください。- M
- 月の数値
- MM
- 月の数値(1桁の場合は 01 のように表示される)
- MMM
- 月を表す言葉の省略形
- MMMM
- 月を表す言葉のフルネーム
- MMMMM
- 月を表す言葉のイニシャル
出力用コード
省略形やイニシャルはどのように表示されるのか、実際に出力して試してみました。 今回は以下のようなコードを組んでみました。<table border='1' style='border: 1px solid gray; '>
<tr>
<th>月</th>
<th>M</th>
<th>MM</th>
<th>MMM</th>
<th>MMMM</th>
<th>MMMMM</th>
</tr>
<b:loop values='data:posts.length - 1 to 0' var='i'>
<tr>
<th><b:eval expr='data:posts[i].date format "M 月"'/></th>
<td><b:eval expr='data:posts[i].date format "M"'/></td>
<td><b:eval expr='data:posts[i].date format "MM"'/></td>
<td><b:eval expr='data:posts[i].date format "MMM"'/></td>
<td><b:eval expr='data:posts[i].date format "MMMM"'/></td>
<td><b:eval expr='data:posts[i].date format "MMMMM"'/></td>
</tr>
</b:loop>
</table>
出力結果(日本語)
日本語ブログでこの値を出力すると、以下のようになります。月 | M | MM | MMM | MMMM | MMMMM |
---|---|---|---|---|---|
1 月 | 1 | 01 | 1月 | 1月 | 1 |
2 月 | 2 | 02 | 2月 | 2月 | 2 |
3 月 | 3 | 03 | 3月 | 3月 | 3 |
4 月 | 4 | 04 | 4月 | 4月 | 4 |
5 月 | 5 | 05 | 5月 | 5月 | 5 |
6 月 | 6 | 06 | 6月 | 6月 | 6 |
7 月 | 7 | 07 | 7月 | 7月 | 7 |
8 月 | 8 | 08 | 8月 | 8月 | 8 |
9 月 | 9 | 09 | 9月 | 9月 | 9 |
10 月 | 10 | 10 | 10月 | 10月 | 10 |
11 月 | 11 | 11 | 11月 | 11月 | 11 |
12 月 | 12 | 12 | 12月 | 12月 | 12 |
さすがに睦月とか如月とかは定義されてないみたいですね。一字表記も存在しないみたいでアラビア数字が複数桁入ってます。月の名前は言語によって違うため、英語でも出力してみましょう。
出力結果(英語)
英語(アメリカ合衆国)ブログでこの値を出力すると、以下のようになります。月 | M | MM | MMM | MMMM | MMMMM |
---|---|---|---|---|---|
1 月 | 1 | 01 | Jan | January | J |
2 月 | 2 | 02 | Feb | February | F |
3 月 | 3 | 03 | Mar | March | M |
4 月 | 4 | 04 | Apr | April | A |
5 月 | 5 | 05 | May | May | M |
6 月 | 6 | 06 | Jun | June | J |
7 月 | 7 | 07 | Jul | July | J |
8 月 | 8 | 08 | Aug | August | A |
9 月 | 9 | 09 | Sep | September | S |
10 月 | 10 | 10 | Oct | October | O |
11 月 | 11 | 11 | Nov | November | N |
12 月 | 12 | 12 | Dec | December | D |
こうやって見ると MMMMM では何月かわからない月がありますね。普段はそれ以外を使ったほうが良さそうです。
週番号
週番号を意味するシンボルです。週番号は地域によって週の最初の曜日や第1週を決める基準が異なります。日本では日曜日を週の初めとして、1月1日が含まれた週が第1週です。ブログの言語が欧州のものである場合、月曜日を週の最初として、その年の日が4日以上含まれた週がその年の第1週となります。- w
- 年間の週番号。ウィークナンバー。「YYYY年 第w週」→「2018年 第14週」のように使う。
- ww
- 年間の週番号。ウィークナンバー。1桁の場合は 01 のように表示される。
- W
- 月間の週番号。年間の週番号と同様の計算で、月間に直した週番号。※この数値は「第○月曜日」などの表示には使えません。これについては後述の「曜日」の項目を参照してください。
出力用コード
どこに年と週の境界があるのか確かめてみましょう。今度は以下のコードです。参考にするために年も表示します。テスト用ブログに1月1日の曜日がそれぞれ違う年の1月1日の投稿と、そこから数日遡った投稿を作っておきました。
<table border='1' style='border: 1px solid gray; '>
<tr>
<th>投稿名</th>
<th>yyyy</th>
<th>YYYY</th>
<th>w</th>
<th>ww</th>
<th>W</th>
</tr>
<b:loop values='data:posts.length - 1 to 0' var='i'>
<tr>
<th><b:eval expr='data:posts[i].title'/></th>
<td><b:eval expr='data:posts[i].date format "yyyy"'/></td>
<td><b:eval expr='data:posts[i].date format "YYYY"'/></td>
<td><b:eval expr='data:posts[i].date format "w"'/></td>
<td><b:eval expr='data:posts[i].date format "ww"'/></td>
<td><b:eval expr='data:posts[i].date format "W"'/></td>
</tr>
</b:loop>
</table>
出力結果(日本語)
日本語ブログで表示すると以下のようになりました。
投稿名 | yyyy | YYYY | w | ww | W |
---|---|---|---|---|---|
1月1日(月曜日)の投稿 | 2001 | 2001 | 1 | 01 | 1 |
1月1日(火曜日)の投稿 | 2002 | 2002 | 1 | 01 | 1 |
1月1日(水曜日)の投稿 | 2003 | 2003 | 1 | 01 | 1 |
1月1日(木曜日)の投稿 | 2009 | 2009 | 1 | 01 | 1 |
1月1日(金曜日)の投稿 | 2010 | 2010 | 1 | 01 | 1 |
1月1日(土曜日)の投稿 | 2011 | 2011 | 1 | 01 | 1 |
1月1日(日曜日)の投稿 | 2017 | 2017 | 1 | 01 | 1 |
日本やアメリカ、中国、韓国などでは1月1日が含まれる週が第1週なのだそうです。なので 1月1日の w などは全部 1 で、 yyyy と YYYY の結果は一致してます。
投稿名 | yyyy | YYYY | w | ww | W |
---|---|---|---|---|---|
12月29日(金曜日)の投稿 | 2017 | 2017 | 52 | 52 | 5 |
12月30日(土曜日)の投稿 | 2017 | 2017 | 52 | 52 | 5 |
12月31日(日曜日)の投稿 | 2017 | 2018 | 1 | 01 | 6 |
1月1日(月曜日)の投稿 | 2018 | 2018 | 1 | 01 | 1 |
どの地域であっても、週が年の境界を跨ぐケースはあります。たとえば2018年1月の第1週は2017年12月31日~2018年1月6日です。この2017年12月31日を年月日で表す場合は 2017 が入る yyyy を使う必要があり、週番号で表す場合は 2018 年第1週なので 2018 が入る YYYY を使う必要があります。
なお、 W が表す値は少し違っていて、月の最初の日から週の終わりまでが1週目です。たとえば、2017年12月の1周目は 12月1日(金曜日)~12月2日(土曜日)の2日間だけ、以降は日曜日が来るごとに一つ増えて、12月31日(日曜日)は12月の6週目を表し、次の日である1月1日(月曜日)は1月の1週目として数えられます。このシンボルはその日が月間カレンダーの何行目かを知るのにちょうどいい、というかそれくらいしか使わないような気がします。
出力結果(イギリス英語)
英語(イギリス)ブログで表示した場合は次のようになります。投稿名 | yyyy | YYYY | w | ww | W |
---|---|---|---|---|---|
1月1日(月曜日)の投稿 | 2001 | 2001 | 1 | 01 | 1 |
1月1日(火曜日)の投稿 | 2002 | 2002 | 1 | 01 | 1 |
1月1日(水曜日)の投稿 | 2003 | 2003 | 1 | 01 | 1 |
1月1日(木曜日)の投稿 | 2009 | 2009 | 1 | 01 | 1 |
1月1日(金曜日)の投稿 | 2010 | 2009 | 53 | 53 | 0 |
1月1日(土曜日)の投稿 | 2011 | 2010 | 52 | 52 | 0 |
1月1日(日曜日)の投稿 | 2017 | 2016 | 52 | 52 | 0 |
欧州では、「月曜日を基準とし、その年の日が4日以上含まれた最初の週」を第1週とします。そのため、1月1日が金曜日~日曜日の場合、1月1日の週は前の年の第53週や第52週として扱われます。この週の計算方法が国際標準でもあります。
中東について
中東でも週の初めの曜日と年の判定が違うという情報を目にして試してみたのですが、アラビア語やヘブライ語などにしても日本と同じ結果になっていました。右から読む文化なので表の左右が逆転してはいましたが、値は日本と同じです。日
日にちを意味するシンボルです。これも大文字小文字を間違えないようにご注意ください。- d
- 月の初めから数えて何日目か
- dd
- 月の初めから数えて何日目か(1桁の場合は 01 のように表示される)
- D
- 年の初めから数えて何日目か
- DD
- 年の初めから数えて何日目か(1桁の場合は 01 のように表示される)
- DDD
- 年の初めから数えて何日目か(1桁の場合は 001 のように表示される)
曜日
曜日を意味するシンボルです。- F
- 月間の同じ曜日が何度目か。1~7日は1、8~14日は2、15~21日は3、22~28日は4、29~31日は5となる。 曜日と組み合わせて「第FEEEE」 とすれば、「第2火曜日」のようになる。
- E
- 曜日を一文字で表す
- EE
- 曜日を二文字で表す
- EEE
- 曜日を三文字で表す
- EEEE
- 曜日の名前
出力用コード
曜日がどの様に省略されるのか確かめてみましょう。今回のコードはこちら。ちなみに、事前に各曜日の投稿をテスト用ブログに投稿しておきました。
<table border='1' style='border: 1px solid gray; '>
<tr>
<th>投稿名</th>
<th>F</th>
<th>E</th>
<th>EE</th>
<th>EEE</th>
<th>EEEE</th>
</tr>
<b:loop values='data:posts.length - 1 to 0' var='i'>
<tr>
<th><b:eval expr='data:posts[i].title'/></th>
<td><b:eval expr='data:posts[i].date format "F"'/></td>
<td><b:eval expr='data:posts[i].date format "E"'/></td>
<td><b:eval expr='data:posts[i].date format "EE"'/></td>
<td><b:eval expr='data:posts[i].date format "EEE"'/></td>
<td><b:eval expr='data:posts[i].date format "EEEE"'/></td>
</tr>
</b:loop>
</table>
出力結果(日本語)
日本語でこのブログを表示すると、以下のようになります。
投稿名 | F | E | EE | EEE | EEEE |
---|---|---|---|---|---|
第一月曜日の投稿 | 1 | 月 | 月 | 月 | 月曜日 |
第二火曜日の投稿 | 2 | 火 | 火 | 火 | 火曜日 |
第三水曜日の投稿 | 3 | 水 | 水 | 水 | 水曜日 |
第四木曜日の投稿 | 4 | 木 | 木 | 木 | 木曜日 |
第一金曜日の投稿 | 1 | 金 | 金 | 金 | 金曜日 |
第一土曜日の投稿 | 1 | 土 | 土 | 土 | 土曜日 |
第一日曜日の投稿 | 1 | 日 | 日 | 日 | 日曜日 |
E~EEE まですべて「曜日」の部分を省略した書き方になっていますね。E~EEE のどれを使うか迷ったので、英語表記でも参考にしてみましょう。
出力結果(英語)
英語(アメリカ合衆国)ブログでこの値を出力すると、以下のようになります。
投稿名 | F | E | EE | EEE | EEEE |
---|---|---|---|---|---|
第一月曜日の投稿 | 1 | Mon | Mon | Mon | Monday |
第二火曜日の投稿 | 2 | Tue | Tue | Tue | Tuesday |
第三水曜日の投稿 | 3 | Wed | Wed | Wed | Wednesday |
第四木曜日の投稿 | 4 | Thu | Thu | Thu | Thursday |
第一金曜日の投稿 | 1 | Fri | Fri | Fri | Friday |
第一土曜日の投稿 | 1 | Sat | Sat | Sat | Saturday |
第一日曜日の投稿 | 1 | Sun | Sun | Sun | Sunday |
って、こっちも E~EEE のどれも変わらないじゃないか~い! とりあえず、省略するなら EEE、 そうでなければ EEEE を使うのが良いかもしれません。
時間帯
時間帯を表すシンボルです。名前だけでなく、何時から何時までを呼び分けるかも地域によって違うらしいです。- aaaa
- 午前か午後か
- bbbb
- 午前か午後か正午か
- BBBB
- 朝か正午か昼か夕方か夜か夜中か
出力用コード
実はこの備忘録を書く上で一番気になっていた「時間帯」。曖昧すぎて、何時頃をどういうふうに言うのか、見当がつかなかったんです。例に漏れず、0 時 から 23 時まで 1 時間刻みの投稿をがんばって用意しました。本文のない空の投稿とはいえ、なかなか骨が折れる作業です。そして出力用のコードはこんな感じ。<table border='1' style='border: 1px solid gray; '>
<tr>
<th>投稿名</th>
<th>h</th>
<th>H</th>
<th>aaaa</th>
<th>bbbb</th>
<th>BBBB</th>
</tr>
<b:loop values='data:posts.length - 1 to 0' var='i'>
<tr>
<th><b:eval expr='data:posts[i].title'/></th>
<td><b:eval expr='data:posts[i].date format "h"'/></td>
<td><b:eval expr='data:posts[i].date format "H"'/></td>
<td><b:eval expr='data:posts[i].date format "aaaa"'/></td>
<td><b:eval expr='data:posts[i].date format "bbbb"'/></td>
<td><b:eval expr='data:posts[i].date format "BBBB"'/></td>
</tr>
</b:loop>
</table>
出力結果(日本語)
日本語のブログではこのように表示されます。投稿名 | h | H | aaaa | bbbb | BBBB |
---|---|---|---|---|---|
0時の投稿 | 3 | 15 | 午後 | 午後 | 昼 |
1時の投稿 | 4 | 16 | 午後 | 午後 | 夕方 |
2時の投稿 | 5 | 17 | 午後 | 午後 | 夕方 |
3時の投稿 | 6 | 18 | 午後 | 午後 | 夕方 |
4時の投稿 | 7 | 19 | 午後 | 午後 | 夜 |
5時の投稿 | 8 | 20 | 午後 | 午後 | 夜 |
6時の投稿 | 9 | 21 | 午後 | 午後 | 夜 |
7時の投稿 | 10 | 22 | 午後 | 午後 | 夜 |
8時の投稿 | 11 | 23 | 午後 | 午後 | 夜中 |
9時の投稿 | 12 | 0 | 午前 | 午前 | 夜中 |
10時の投稿 | 1 | 1 | 午前 | 午前 | 夜中 |
11時の投稿 | 2 | 2 | 午前 | 午前 | 夜中 |
12時の投稿 | 3 | 3 | 午前 | 午前 | 夜中 |
13時の投稿 | 4 | 4 | 午前 | 午前 | 朝 |
14時の投稿 | 5 | 5 | 午前 | 午前 | 朝 |
15時の投稿 | 6 | 6 | 午前 | 午前 | 朝 |
16時の投稿 | 7 | 7 | 午前 | 午前 | 朝 |
17時の投稿 | 8 | 8 | 午前 | 午前 | 朝 |
18時の投稿 | 9 | 9 | 午前 | 午前 | 朝 |
19時の投稿 | 10 | 10 | 午前 | 午前 | 朝 |
20時の投稿 | 11 | 11 | 午前 | 午前 | 朝 |
21時の投稿 | 12 | 12 | 午後 | 正午 | 正午 |
22時の投稿 | 1 | 13 | 午後 | 午後 | 昼 |
23時の投稿 | 2 | 14 | 午後 | 午後 | 昼 |
……。
…………。
(なんで正午が 9 時間もズレてるんだろう)
ブログのタイムゾーンの設定は東京(+9:00)であること、言語は日本語であること、投稿の名前と投稿日時のズレが無いこと、投稿日時が日本標準時であることを4回くらい確認しましたが、間違いありませんでした。
で、急遽いろいろ調べた結論ですが、 format 演算子を使って文字列に変換するとグリニッジ標準時のタイムゾーンで時刻が解釈されるようです。困った。 format 演算子に正しいタイムゾーンで解釈させる方法か、テーマ側でなんとか対策する方法を見つけられたらまたお知らせします。
出力結果(アメリカ英語)
英語(アメリカ合衆国)のブログでは次のように表示されます。投稿名 | h | H | aaaa | bbbb | BBBB |
---|---|---|---|---|---|
0時の投稿 | 3 | 15 | PM | PM | in the afternoon |
1時の投稿 | 4 | 16 | PM | PM | in the afternoon |
2時の投稿 | 5 | 17 | PM | PM | in the afternoon |
3時の投稿 | 6 | 18 | PM | PM | in the evening |
4時の投稿 | 7 | 19 | PM | PM | in the evening |
5時の投稿 | 8 | 20 | PM | PM | in the evening |
6時の投稿 | 9 | 21 | PM | PM | at night |
7時の投稿 | 10 | 22 | PM | PM | at night |
8時の投稿 | 11 | 23 | PM | PM | at night |
9時の投稿 | 12 | 0 | AM | AM | at night |
10時の投稿 | 1 | 1 | AM | AM | at night |
11時の投稿 | 2 | 2 | AM | AM | at night |
12時の投稿 | 3 | 3 | AM | AM | at night |
13時の投稿 | 4 | 4 | AM | AM | at night |
14時の投稿 | 5 | 5 | AM | AM | at night |
15時の投稿 | 6 | 6 | AM | AM | in the morning |
16時の投稿 | 7 | 7 | AM | AM | in the morning |
17時の投稿 | 8 | 8 | AM | AM | in the morning |
18時の投稿 | 9 | 9 | AM | AM | in the morning |
19時の投稿 | 10 | 10 | AM | AM | in the morning |
20時の投稿 | 11 | 11 | AM | AM | in the morning |
21時の投稿 | 12 | 12 | PM | noon | noon |
22時の投稿 | 1 | 13 | PM | PM | in the afternoon |
23時の投稿 | 2 | 14 | PM | PM | in the afternoon |
前述の不具合(?)の影響があるので、投稿の名前にある時刻は 9 時間引いて考えてください。朝がやや遅く、夜もそれに合わせて遅い感じですね。アメリカってそうなのか。ふむふむ。
時分
時間と分を表すシンボルです。12時間表記の場合、午前 0 時ではなく午後 12 時として表します。
- h
- 時間(12時間表記)。1から12の数値。
- hh
- 時間(12時間表記)。1から12の数値。一桁の場合は 01 のようになる。
- H
- 時間(24時間表記)。0から23の数値。
- HH
- 時間(24時間表記)。0から23の数値。一桁の場合は 01 のようになる。
- m
- 分。0から59の数値。
- mm
- 分。0から59の数値。一桁の場合は 01 のようになる。
調査を終えて
というわけで、 format 演算子で指定できるシンボルごとに、その出力結果を調査しました。 format 演算子は現状では設定した通りのタイムゾーンで解釈してくれないので、このままでは使いにくいですね。ブログの設定以外にテーマ側でなにか特殊な設定をする必要があるのを私が見落としているのか、もしくは単なる不具合なのかは判断ができません。
最初は「これは便利!」と思って記事にしようとしていただけに、ちょっと残念です。
format 演算子を形式の処理に使わない荒業
タイムゾーンについて調査しながら覚書程度に書いていたんですが、本題から逸れてしまうと思ってカットしたので最後に載せておきます。
Blogger のサーバーが扱える演算子の種類はそう多くないので、期待した結果が得られるようにタイムゾーンを調整したデータを用意することもできません。
そこで、タイムゾーンによらないデータを取得しようと試みました。
Blogger のサーバーが扱える演算子の種類はそう多くないので、期待した結果が得られるようにタイムゾーンを調整したデータを用意することもできません。
そこで、タイムゾーンによらないデータを取得しようと試みました。
<b:eval expr='data:posts[i].date.iso8601 '/> からは、次のような値が取得できます。
2018-11-01T00:00:00+09:00
「年-月-日T時:分:秒+時:分」 または 「年-月-日T時:分:秒-時:分」、あるいは「年-月-日T時:分:秒Z」 の形の文字列です。投稿日時とそのタイムゾーンが記録されています。
また、iso8601 以外にも、 date.year、date.month、date.day で正しい年、月、日を取得することができます。時、分、秒は取得できません。分と秒はタイムゾーンの影響を(たぶん)受けないので format 演算子で取得しても問題ありません。
曜日も date.dayOfWeek で 1~7 の数値が入手でき、 1 が月曜日を意味し、 7 が日曜日を意味します。同じように date.dayOfYear でその年の何日目かもわかります。
問題は時刻なのですが、Blogger では細かな文字列処理はできないので、ループ処理で date.iso8601 の文字列に「T00」~「T23」の値が含まれているか否かを判定し、含まれていたらそのループ番号を時間とするのはどうでしょう。 iso8601 の文字列はブログの設定にあるタイムゾーンに変換されたものが出力されるので、わざわざタイムゾーンを計算し直す必要はありません。
ということで、日本限定ですがいろいろ取得してみた結果がこちら。
週番号や週境界の年は日本やアメリカなどの判定方法(日曜始まり、1月1日が含まれる週が第1週)を基準にしています。ほかの地域の場合は計算式を変えないといけません。
曜日を表示するのに使った方法を応用すれば月の名前を表示することもできます。また、時刻に条件分岐を使えば時間帯とかの表現にも使うことができると思います。
最低二桁の表示が必要なら、月、日、時、週番号は一桁なら '0' を先頭に数字を結合します。
「年-月-日T時:分:秒+時:分」 または 「年-月-日T時:分:秒-時:分」、あるいは「年-月-日T時:分:秒Z」 の形の文字列です。投稿日時とそのタイムゾーンが記録されています。
また、iso8601 以外にも、 date.year、date.month、date.day で正しい年、月、日を取得することができます。時、分、秒は取得できません。分と秒はタイムゾーンの影響を(たぶん)受けないので format 演算子で取得しても問題ありません。
曜日も date.dayOfWeek で 1~7 の数値が入手でき、 1 が月曜日を意味し、 7 が日曜日を意味します。同じように date.dayOfYear でその年の何日目かもわかります。
問題は時刻なのですが、Blogger では細かな文字列処理はできないので、ループ処理で date.iso8601 の文字列に「T00」~「T23」の値が含まれているか否かを判定し、含まれていたらそのループ番号を時間とするのはどうでしょう。 iso8601 の文字列はブログの設定にあるタイムゾーンに変換されたものが出力されるので、わざわざタイムゾーンを計算し直す必要はありません。
ということで、日本限定ですがいろいろ取得してみた結果がこちら。
コード
<table border='1' style='border: 1px solid gray; '>
<tr>
<th>iso</th>
<th>年</th>
<th>月</th>
<th>日</th>
<th>時</th>
<th>分</th>
<th>秒</th>
<th>第 N</th>
<th>曜日</th>
<th>週番号の年</th>
<th>週番号</th>
</tr>
<b:loop values='data:posts.length - 1 to 0' var='i'>
<tr>
<th><b:eval expr='data:posts[i].date.iso8601'/></th>
<td><b:eval expr='data:posts[i].date.year'/></td>
<td><b:eval expr='data:posts[i].date.month'/></td>
<td><b:eval expr='data:posts[i].date.day'/></td>
<td><b:loop values='0 to 23' var='n'><b:if cond='data:posts[i].date.iso8601 contains (data:n < 10 ? "T0" : "T") + data:n'><b:eval expr='data:n'/></b:if></b:loop></td>
<td><b:eval expr='data:posts[i].date format "mm"'/></td>
<td><b:eval expr='data:posts[i].date format "ss"'/></td>
<td><b:eval expr='(data:posts[data:i].date.day - data:posts[data:i].date.day % 7) / 7 + 1'/></td>
<td><b:with var='weeks' value='["", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日"]'><b:eval expr='data:weeks[data:posts[data:i].date.dayOfWeek]'/></b:with></td>
<td><b:if cond='data:posts[data:i].date.month == 12 and data:posts[data:i].date.day > (25 + data:posts[data:i].date.dayOfWeek % 7)'><b:eval expr='data:posts[data:i].date.year + 1'/><b:else/><b:eval expr='data:posts[data:i].date.year'/></b:if></td>
<td><b:if cond='data:posts[data:i].date.month == 12 and data:posts[data:i].date.day > (25 + data:posts[data:i].date.dayOfWeek % 7)'>1<b:else/><b:with var='x' value='12 + data:posts[data:i].date.dayOfYear - data:posts[data:i].date.dayOfWeek % 7'><b:eval expr='(data:x - data:x % 7) / 7'/></b:with></b:if></td>
</tr>
</b:loop>
</table>
実行結果
iso | 年 | 月 | 日 | 時 | 分 | 秒 | 第 N | 曜日 | 週番号の年 | 週番号 |
---|---|---|---|---|---|---|---|---|---|---|
2017-12-29T15:00:00+09:00 | 2017 | 12 | 29 | 15 | 00 | 00 | 5 | 金曜日 | 2017 | 52 |
2017-12-30T15:00:00+09:00 | 2017 | 12 | 30 | 15 | 00 | 00 | 5 | 土曜日 | 2017 | 52 |
2017-12-31T15:00:00+09:00 | 2017 | 12 | 31 | 15 | 00 | 00 | 5 | 日曜日 | 2018 | 1 |
2018-01-01T15:00:00+09:00 | 2018 | 1 | 1 | 15 | 00 | 00 | 1 | 月曜日 | 2018 | 1 |
週番号や週境界の年は日本やアメリカなどの判定方法(日曜始まり、1月1日が含まれる週が第1週)を基準にしています。ほかの地域の場合は計算式を変えないといけません。
曜日を表示するのに使った方法を応用すれば月の名前を表示することもできます。また、時刻に条件分岐を使えば時間帯とかの表現にも使うことができると思います。
最低二桁の表示が必要なら、月、日、時、週番号は一桁なら '0' を先頭に数字を結合します。
0 件のコメント :
コメントを投稿