SharePoint REST APIを使ってSharePointからデータを取得するときに、個人的に結構な頻度で悩むのが「日付と時刻」列に設定した値の取り扱い方。
- 取得できる値って、UTC時間だっけ?JST時間だっけ?
- あ、この形式で返ってくるんだった、データ変換しないと・・
なんてことを繰り返している気がするので、まとめです。
APIリクエストで取得できる値は、UTC時間。かつ文字列。
早速結論ですが、リクエストして帰ってくる値は、 「UTC時間 かつ 日時文字列」 の形式です。
実際に取得してみる
事前準備として、サイトコレクションのタイムゾーンを日本時間(UTC +09:00)に設定。
リストにアイテムを登録した時点でのタイムゾーンが適用されます。
サイトコレクションのタイムゾーンを途中で変更した場合、すでに登録されているアイテムのタイムゾーンは切り替わりません。タイムゾーンを切り替えたい場合は、アイテムを更新する、再登録するなどする必要があります。
以下の「日付と時刻のテストリスト」の [開始日] 列(内部名:StartDate)の値を取得してみます。
- リクエストURL
GET: {site_url}/_api/lists/getbytitle('{list_name}')/items
上図のように、UTC時間(日本時間 -9時間) かつ yyyy-MM-ddTHH: mm:ssZ のISO8601フォーマットで文字列として返ってきます。
例えば取得した値を画面に表示したい場合、そのままではUTC時間で表示されてしまうので、地域のタイムゾーンに変換する、という処理が必要になることが多いです。
変換方法
方法はいくつかあると思いますが、備忘録も兼ねて一例を。
let dateObj = new Date("2023-05-31T15:00:00Z"); // 取得した日付文字列を引数に設定
let year: string = dateObj.getFullYear().toString(); // 年
let month: string = (dateObj.getMonth() + 1).toString().padStart(2, '0'); // 月
let date: string = dateObj.getDate().toString().padStart(2, '0'); // 日
let hours: string = dateObj.getHours().toString().padStart(2, '0'); // 時
let minutes: string = dateObj.getMinutes().toString().padStart(2, '0'); // 分
let seconds: string = dateObj.getMinutes().toString().padStart(2, '0'); // 秒
let dateString = `${year}/${month}/${date} ${hours}:${minutes}:${seconds}`; // 2023/06/01 00:00:00
-
APIリクエストで取得した日付文字列("2023-05-31T15:00:00Z")をDateオブジェクトに変換。
-
Dateオブジェクトの各メソッドで年・月・日・時・分・秒を取得し文字列に変換。
→ これらのメソッドは、ローカル環境のタイムゾーンに基づき値が取得できる。 -
ゼロパディング("00")を行い2桁の形式に変換。
-
変換した値を任意の形式に組み立てる。
参考
-
JavaScriptでゼロパディングする
1桁の数値を0埋めするためにsliceメソッドを使っていましたが、padStartメソッドというものがあるのですね。直観的でスッキリ書けるこちらを使いました。
こんな風に表示できる
UTC時間をJST時間に、
yyyy-MM-ddTHH: mm:ssZ の文字列を yyyy/MM/dd HH: mm:ss に変換完了です。
繰り返しですが、忘れないように以下メモ。