很多时候我们都是可以用UTC的,但是有时候为了方便,或者兼容现在的系统,我们需要把时区改成自己想的的时区。 如我们 +8的北京时间 设置环境变量 TZ Asia/Shanghai 如下
FROM nginx
ENV TZ Asia/Shanghai
接下来用如下的命令来构建和测试它
docker build -t test .
docker run test date
可以看到如下的 Sat Nov 21 17:03:29 CST 2020
对于asp.net core 的镜像也是有效的 mcr.microsoft.com/dotnet/core/runtime:3.1
用alpine构建出来的镜像是没有时区信息的。 C#当中用这个来获取时区也是获取不到的 TimeZoneInfo.FindSystemTimeZoneById("Europe/Amsterdam");
可以用Apk 来安装 tzdata,代码如下。
FROM alpine:3.10.2
RUN apk update \
&& apk add tzdata \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
后面的这两步是用来指定时区的,如果不用这两步的话,也是可以用环境变量TZ。
C# 代码想要获取某个时区的写法也是不一样的。 linux下的zoneId 跟 windows下是不一样的。
var zoneId = "W. Europe Standard Time";
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
zoneId = "Europe/Amsterdam";
}
var zone = TimeZoneInfo.FindSystemTimeZoneById(zoneId);
//TimeZoneInfo.GetSystemTimeZones() 整个列表可以通过这个来获取