引き続きGatsby+Contentfulの開発中。いやー楽しい。ブログやWEBメディアに必要な機能は概ね関数やプラグインが用意されてるし、Wordpressプラグインのようなカスタマイズ性の悪さも感じない。

今回は記事に表示する日付について。Contentfulでは記事を作成する際、こちら側でContent Modelを用意しなくても、自動で作成日などが生成される。

もちろんGatsby側でGraphQLを利用して取得・表示ができるので、その日付型の変換方法についてまとめておく。

取得できる記事の日付のフィールド名

デフォルトでは2種類の日付フィールド(作成日と更新日)が存在する。

記事の作成日を取得するGraphQLクエリは下記。

allContentfulBlogArticle {
    edges {
        node {
            createdAt
        }
    }
}
</code></pre>
<p><strong>記事の更新日</strong>の取得はこちら。</p>
<pre><code>edges {
    node {
        updatedAt
    }
}

ちなみに「公開日(PublishedAt)」はデフォルトでは存在しないので、必要な場合は自分でContent Modelに追加する必要がある。

デフォルトの日付型

上記クエリをそのままフロントに投げると…

2020-06-11T09:29:41.084Z

のような表示になる。

時間なども含まれているのはいいんだけど、可読性がよくないので、このフォーマットを変換していく。

日付型の変換クエリ

日付のフォーマットはクエリを投げる時点で指定する。

例えば「2020年02月20日」としたい場合、GraphQLに投げるクエリは下記のようになる。

export const query = graphql`
    query BlogArticleQueryTop {
        allContentfulBlogArticle(filter: {node_locale: {eq: "ja-JP"}}) {
            edges {
                node {
                    createdAt(formatString: "YYYY年MM月DD日")
                }
            }
        }
    }
`;

「May 28, 2020」としたい場合は下記。

createdAt(formatString: "MMMM DD, YYYY")

わかりやすっ!

一つのフィールドを複数のフォーマットで取得する

そして日付を複数の日付型に変換したい場合、エイリアスでクエリを書くことで同じフィールドでも複数のフォーマットで取得ができる。

createdAt: createdAt(formatString: "YYYY/MM/DD")
createdTime: createdAt(formatString: "H:m:s")

ビューが汚れないし書きやすいしこの記法好きだなー。