経緯
後輩ちゃんから聞かれました。
「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()
ブラウザで確認してみます
予定通りの値が入っているのが確認できます。