LoginSignup
0
0

SharePoint REST APIで「日付と時刻」データを扱うときに、覚えておきたいこと。

Posted at

SharePoint REST APIを使ってSharePointからデータを取得するときに、個人的に結構な頻度で悩むのが「日付と時刻」列に設定した値の取り扱い方。

  • 取得できる値って、UTC時間だっけ?JST時間だっけ?
  • あ、この形式で返ってくるんだった、データ変換しないと・・

なんてことを繰り返している気がするので、まとめです。

APIリクエストで取得できる値は、UTC時間。かつ文字列。

早速結論ですが、リクエストして帰ってくる値は、 「UTC時間 かつ 日時文字列」 の形式です。

実際に取得してみる

事前準備として、サイトコレクションのタイムゾーンを日本時間(UTC +09:00)に設定。
image.png

リストにアイテムを登録した時点でのタイムゾーンが適用されます。
サイトコレクションのタイムゾーンを途中で変更した場合、すでに登録されているアイテムのタイムゾーンは切り替わりません。タイムゾーンを切り替えたい場合は、アイテムを更新する、再登録するなどする必要があります。


以下の「日付と時刻のテストリスト」の [開始日] 列(内部名:StartDate)の値を取得してみます。
image.png

  • リクエストURL
GET: {site_url}/_api/lists/getbytitle('{list_name}')/items
  • リクエスト結果
    image.png

上図のように、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
  1. APIリクエストで取得した日付文字列("2023-05-31T15:00:00Z")をDateオブジェクトに変換。

  2. Dateオブジェクトの各メソッドで年・月・日・時・分・秒を取得し文字列に変換。
    → これらのメソッドは、ローカル環境のタイムゾーンに基づき値が取得できる。

  3. ゼロパディング("00")を行い2桁の形式に変換。

  4. 変換した値を任意の形式に組み立てる。

参考

こんな風に表示できる

image.png
UTC時間をJST時間に、
yyyy-MM-ddTHH: mm:ssZ の文字列を yyyy/MM/dd HH: mm:ss に変換完了です。

繰り返しですが、忘れないように以下メモ。

SharePoint REST APIでは、UTC時間かつ文字列で時刻情報が取得できる。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0