SharePoint Online の日付と時刻型は UTC で登録されているので気をつけよう

経緯

後輩ちゃんから聞かれました。
「SharePoint にバッチでどうのこうのする実装終わってテストしていたら、日付と時刻型が -9 時間になっていることに気づいて調べたのですが、UTC というものらしく、JST への戻し方を調べていたのですが上手く見つけられなかったです。いい方法知っていますか?」

「私はこうやっているよ」というアウトプットをしますね。

そもそも UTC とは?

UTC は協定世界時というものです。
私の拙い説明をつらつらと並べるより、詳しくは Wikipedia を読んでください。

私達が使っているのが JST で、UTC より 9 時間進んでいます(UTC+9)にです。未来を生きてる日本カッコいい!!

ちなみに、3 ヶ月ほど前に仕事でマレーシアに行きましたが、マレーシアは UTC+8 となっているので、日本とテレカンする時に「朝の 9 時から会議しましょう。 …. ちょっとまって、日本時間で 10 時です!!」というやり取りがありました。海外出張慣れしてないのがバレバレです。

検証環境

検証用で、SharePoint Online に次のリストを作りました。

列名 内部列名 列の型
タイトル Title 1行テキスト
日付と時刻型 TypeOfDatetime 日付と時刻

なにが問題なのか

早速先程のリストに登録されたアイテムを PowerShell で取得してみます。

ブラウザから登録したデータ

PowerShell で取得したデータ

TypeOfDatetime      Title
--------------      -----
2018/06/16 15:00:00 テスト1 
2018/06/17 3:00:00  テスト2 
2018/06/17 8:00:00  テスト3 
2018/06/17 14:00:00 テスト4 

時間が 9 時間ずれてますよね。

次に、PowerShell から 1 件データを登録してみます。
※コード抜粋

$item = $list.AddItem((New-Object Microsoft.SharePoint.Client.ListItemCreationInformation))
$item["Title"] = "PowerShell Add1"
$item["TypeOfDatetime"] = "2018/07/01 00:00:00"
$item.Update()
$ctx.ExecuteQuery()

ブラウザで確認すると、登録したデータに +9 時間されてます。
2018/07/01 00:00:00 で登録したいのに困りますよね。

次はサイトの設定 → 地域の設定でタイムゾーンを変更してみます。

タイムゾーンを UTC+8 に変更後にブラウザで確認すると、登録したデータに +8 時間されているのが確認できます。

つまり、SharePoint Online 側の設定次第になるので、タイムゾーンを合わせて登録する必要があります。

どうやるの?

ベストプラクティスかどうか判らないですが、私はこうやっています。

$datetime = $ctx.Web.RegionalSettings.TimeZone.LocalTimeToUTC("2018/07/01 00:00:00")
# サーバーに時間を問い合わせる
$ctx.ExecuteQuery()

$item = $list.AddItem((New-Object Microsoft.SharePoint.Client.ListItemCreationInformation))
$item["Title"] = "PowerShell Add2"
$item["TypeOfDatetime"] = $datetime.value
$item.Update()
$ctx.ExecuteQuery()

ブラウザで確認してみます

予定通りの値が入っているのが確認できます。