【修复】修复.net 6的TimeZone相关调整导致datetime计算错误的问题

【调整】新增datetime的等价类型名time
【调整】Luban.Server的Dockerfile不再拷备localtime文件
main
walon 2021-11-15 23:26:17 +08:00
parent 9cc489ecfd
commit f6b8b32123
8 changed files with 32 additions and 3 deletions

View File

@ -38,6 +38,9 @@ namespace Luban.ClientServer
[Option('t', "template_search_path", Required = false, HelpText = "string template search path.")] [Option('t', "template_search_path", Required = false, HelpText = "string template search path.")]
public string TemplateSearchPath { get; set; } public string TemplateSearchPath { get; set; }
[Option("timezone", Required = false, HelpText = "default timezone")]
public string DefaultTimeZone { get; set; } = "Asia/Shanghai";
} }
private static void PrintUsage(string err) private static void PrintUsage(string err)
@ -170,7 +173,7 @@ Options:
StringTemplateUtil.AddTemplateSearchPath(options.TemplateSearchPath); StringTemplateUtil.AddTemplateSearchPath(options.TemplateSearchPath);
} }
StringTemplateUtil.AddTemplateSearchPath(FileUtil.GetPathRelateApplicationDirectory("Templates")); StringTemplateUtil.AddTemplateSearchPath(FileUtil.GetPathRelateApplicationDirectory("Templates"));
TimeZoneUtil.DefaultTimeZone = TimeZoneInfo.FindSystemTimeZoneById(options.DefaultTimeZone);
GenServer.Ins.Start(true, options.Port, ProtocolStub.Factories); GenServer.Ins.Start(true, options.Port, ProtocolStub.Factories);
GenServer.Ins.RegisterJob("cfg", new Luban.Job.Cfg.JobController()); GenServer.Ins.RegisterJob("cfg", new Luban.Job.Cfg.JobController());

View File

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Luban.Common.Utils
{
public static class TimeZoneUtil
{
public static TimeZoneInfo DefaultTimeZone { get; set; } = TimeZoneInfo.Utc;
}
}

View File

@ -1,3 +1,4 @@
using Luban.Common.Utils;
using Luban.Job.Cfg.DataVisitors; using Luban.Job.Cfg.DataVisitors;
using Luban.Job.Cfg.Utils; using Luban.Job.Cfg.Utils;
using System; using System;
@ -15,10 +16,11 @@ namespace Luban.Job.Cfg.Datas
public DDateTime(DateTime time) public DDateTime(DateTime time)
{ {
this.Time = time; this.Time = time;
// time.Kind == DateTimeKind.Unspecified // time.Kind == DateTimeKind.Unspecified
// DateTimeOffset把它当作Local处理 // DateTimeOffset把它当作Local处理
this._localTime = (int)new DateTimeOffset(time).ToUnixTimeSeconds(); this._localTime = (int)new DateTimeOffset(TimeZoneInfo.ConvertTime(time, TimeZoneUtil.DefaultTimeZone, TimeZoneInfo.Utc)).ToUnixTimeSeconds();
} }
public override bool Equals(object obj) public override bool Equals(object obj)

View File

@ -1,3 +1,4 @@
using Luban.Common.Utils;
using Luban.Job.Cfg.Datas; using Luban.Job.Cfg.Datas;
using Luban.Job.Cfg.Defs; using Luban.Job.Cfg.Defs;
using Luban.Job.Cfg.TypeVisitors; using Luban.Job.Cfg.TypeVisitors;
@ -61,6 +62,7 @@ namespace Luban.Job.Cfg.Utils
public static DDateTime CreateDateTime(string x) public static DDateTime CreateDateTime(string x)
{ {
DateTime dateTime = DateTime.ParseExact(x, dateTimeFormats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None); DateTime dateTime = DateTime.ParseExact(x, dateTimeFormats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);
//return new DDateTime(TimeZoneInfo.ConvertTime(dateTime, TimeZoneUtil.DefaultTimeZone, TimeZoneInfo.Utc));
return new DDateTime(dateTime); return new DDateTime(dateTime);
} }

View File

@ -213,6 +213,7 @@ namespace Luban.Job.Common.Defs
case "vector2": return TVector2.Create(nullable, tags); case "vector2": return TVector2.Create(nullable, tags);
case "vector3": return TVector3.Create(nullable, tags); case "vector3": return TVector3.Create(nullable, tags);
case "vector4": return TVector4.Create(nullable, tags); case "vector4": return TVector4.Create(nullable, tags);
case "time":
case "datetime": return SupportDatetimeType ? TDateTime.Create(nullable, tags) : throw new NotSupportedException($"只有配置支持datetime数据类型"); case "datetime": return SupportDatetimeType ? TDateTime.Create(nullable, tags) : throw new NotSupportedException($"只有配置支持datetime数据类型");
default: default:
{ {

View File

@ -6,6 +6,10 @@
"TestTemplate": { "TestTemplate": {
"commandName": "Project", "commandName": "Project",
"commandLineArgs": "-t D:\\workspace\\luban_examples\\Projects\\CustomTemplates" "commandLineArgs": "-t D:\\workspace\\luban_examples\\Projects\\CustomTemplates"
},
"timezone-utc": {
"commandName": "Project",
"commandLineArgs": "--timezone \"Etc/UTC\""
} }
} }
} }

View File

@ -41,7 +41,6 @@ COPY nuget.config ./nuget.config
RUN dotnet publish -c Release -o out RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/runtime:6.0 AS runtime FROM mcr.microsoft.com/dotnet/runtime:6.0 AS runtime
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
WORKDIR /app WORKDIR /app
COPY --from=build /app/Luban.Server/out ./ COPY --from=build /app/Luban.Server/out ./
EXPOSE 8899/tcp EXPOSE 8899/tcp

View File

@ -20,6 +20,9 @@ namespace Luban.Server
[Option('t', "template_search_path", Required = false, HelpText = "additional template search path")] [Option('t', "template_search_path", Required = false, HelpText = "additional template search path")]
public string TemplateSearchPath { get; set; } public string TemplateSearchPath { get; set; }
[Option("timezone", Required = false, HelpText = "default timezone")]
public string DefaultTimeZone { get; set; } = "Asia/Shanghai";
} }
private static CommandLineOptions ParseOptions(String[] args) private static CommandLineOptions ParseOptions(String[] args)
@ -56,6 +59,8 @@ namespace Luban.Server
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
TimeZoneUtil.DefaultTimeZone = TimeZoneInfo.FindSystemTimeZoneById(options.DefaultTimeZone);
GenServer.Ins.Start(false, options.Port, ProtocolStub.Factories); GenServer.Ins.Start(false, options.Port, ProtocolStub.Factories);
GenServer.Ins.RegisterJob("cfg", new Luban.Job.Cfg.JobController()); GenServer.Ins.RegisterJob("cfg", new Luban.Job.Cfg.JobController());