Docker & dotnet repl で簡単にLinux環境での動作を確認する。

# はじめに
Linux環境でC#を動かしたときの動作を確認する場合、Windowsで開発している場合はDockerで動かすのがお手軽です。VSCodeのリモートでバック機能を使えば、普段と同じノリでコードを書いて確認もできるし便利ですね。WSL環境を作っておくというのもよいですね。

ただ、特定のメソッドの結果などをお手軽に確認したい場合に毎回コンパイルして、というのはちょっとめんどくさいので、以前紹介した.NETのREPL拡張を使うと簡単に確認することができます。

https://qiita.com/karuakun/items/69adda0e5df44061d3c7

# 現在日時の確認

ここでは、Alpineでローカル時間をJSTにしている場合のDateTimeやDateTimeOffsetのNowが何を返すのかを確認していきます。
まずは.NETのAlpineイメージをインタラクションモードで起動して、.NET REPLをインストールします。

```
❯ docker run --rm -it mcr.microsoft.com/dotnet/sdk:5.0-alpine
# dotnet tool install -g dotnet-repl
# export PATH="$PATH:/root/.dotnet/tools"
```

現時点でのdateコマンドの結果と、DateTime, DateTimeOffset で現在日付を表示するとUTCで表示されることが分かります。

```
# date
Thu Jul 15 02:09:55 UTC 2021
# dotnet repl
                    _   _   _____   _____     ____    _____   ____    _              ____     _  _
                   | \ | | | ____| |_   _|   |  _ \  | ____| |  _ \  | |      _     / ___|  _| || |_
                   |  \| | |  _|     | |     | |_) | |  _|   | |_) | | |     (_)   | |     |_  ..  _|
                _  | |\  | | |___    | |     |  _ <  | |___  |  __/  | |___   _    | |___  |_      _|
               (_) |_| \_| |_____|   |_|     |_| \_\ |_____| |_|     |_____| (_)    \____|   |_||_|

                                        .NET Interactive 💓 Spectre.Console

C# > TimeZone.CurrentTimeZone
╭─✔───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ { System.CurrentSystemTimeZone: StandardName: Coordinated Universal Time, DaylightName: Coordinated Universal   │
│ Time }                                                                                                          │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
C# > DateTime.Now
╭─✔───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 2021-07-15 02:10:57Z                                                                                            │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
C# > DateTime.UtcNow
╭─✔───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 2021-07-15 02:10:59Z                                                                                            │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
C# > DateTimeOffset.UtcNow
╭─✔───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 2021-07-15 02:11:02Z                                                                                            │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
C# > DateTimeOffset.UtcNow.LocalDateTime
╭─✔───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 2021-07-15 02:11:11Z                                                                                            │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
```

# タイムゾーンをJSTにして確認

まずはapkで必要なモジュールをインストールして、dateコマンドで現在日付を確認するとJSTで表示されますね。

```
# apk add --no-cache jq tzdata
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
(1/3) Installing oniguruma (6.9.6-r0)
(2/3) Installing jq (1.6-r1)
(3/3) Installing tzdata (2021a-r0)
Executing busybox-1.32.1-r6.trigger
OK: 59 MiB in 35 packages
# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# echo "Asia/Tokyo" > /etc/timezone
# TZ=Asia/Tokyo
# date
Thu Jul 15 11:30:43 JST 2021
```

次にもう一度.NET REPLに入って確認するとTimeZoneがJSTになってローカル時間で表示されましたね。

```
# dotnet repl
                    _   _   _____   _____     ____    _____   ____    _              ____     _  _
                   | \ | | | ____| |_   _|   |  _ \  | ____| |  _ \  | |      _     / ___|  _| || |_
                   |  \| | |  _|     | |     | |_) | |  _|   | |_) | | |     (_)   | |     |_  ..  _|
                _  | |\  | | |___    | |     |  _ <  | |___  |  __/  | |___   _    | |___  |_      _|
               (_) |_| \_| |_____|   |_|     |_| \_\ |_____| |_|     |_____| (_)    \____|   |_||_|

                                        .NET Interactive 💓 Spectre.Console

C# > TimeZone.CurrentTimeZone
╭─✔───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ { System.CurrentSystemTimeZone: StandardName: Japan Standard Time, DaylightName: Japan Daylight Time }          │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
C# >  DateTime.Now
╭─✔───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 2021-07-15 11:32:45Z                                                                                            │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
C# >  DateTime.UtcNow
╭─✔───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 2021-07-15 02:32:48Z                                                                                            │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
C# > DateTimeOffset.UtcNow
╭─✔───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 2021-07-15 02:32:51Z                                                                                            │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
C# >  DateTimeOffset.UtcNow.LocalDateTime
╭─✔───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 2021-07-15 11:32:57Z                                                                                            │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
```