【修复】修复在某些机器上无法找到"Asia/Shanghai",导致启动失败的问题。新增失败后尝试"China Standard Time"
【修复】修复Luban.ClientServer未初始化DefaultTimeZone,导致默认时区为Utc的bug,严重!main
parent
7df2f6ea86
commit
46ccf6868b
59
README.md
59
README.md
|
|
@ -325,6 +325,44 @@ xml中定义如下
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
或者可以用多级标题头对每个元素单独限定
|
||||||
|
|
||||||
|
<table border="1">
|
||||||
|
|
||||||
|
<tr align="center">
|
||||||
|
<td>##</td>
|
||||||
|
<td>id</td>
|
||||||
|
<td>name</td>
|
||||||
|
<td colspan="9">rewards</td>
|
||||||
|
</tr>
|
||||||
|
<tr align="center">
|
||||||
|
<td>##type</td>
|
||||||
|
<td>int</td>
|
||||||
|
<td>string</td>
|
||||||
|
<td colspan="9">list,Reward</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr align="center">
|
||||||
|
<td>##+</td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td colspan="3">0</td>
|
||||||
|
<td colspan="3">1</td>
|
||||||
|
<td colspan="3">2</td>
|
||||||
|
</tr>
|
||||||
|
<tr align="center">
|
||||||
|
<td>##+</td>
|
||||||
|
<td/>
|
||||||
|
<td/>
|
||||||
|
<td>item_id</td><td>num</td><td>desc</td>
|
||||||
|
<td>item_id</td><td>num</td><td>desc</td>
|
||||||
|
<td>item_id</td><td>num</td><td>desc</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr align="center"><td/><td>1</td><td>task1</td><td>1</td><td>10</td><td>desc1</td><td>2</td><td>12</td><td>desc2</td><td>3</td><td>13</td><td>desc3</td></tr>
|
||||||
|
<tr align="center"><td/><td>2</td><td>task1</td><td>3</td><td>30</td><td>desc3</td><td>4</td><td>40</td><td>desc4</td></tr>
|
||||||
|
<tr align="center"><td/><td>3</td><td>task1</td><td>5</td><td>50</td><td>desc5</td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
### 多行结构列表
|
### 多行结构列表
|
||||||
有时候列表结构的每个结构字段较多,如果水平展开则占据太多列,不方便编辑,如果拆表,无论程序还是策划都不方便,此时可以使用多行模式。支持任意层次的多行结构列表(也即多行结构中的每个元素也可以是多行), name&multi_rows=1或者 *name 都可以表达一个多行解析的字段。
|
有时候列表结构的每个结构字段较多,如果水平展开则占据太多列,不方便编辑,如果拆表,无论程序还是策划都不方便,此时可以使用多行模式。支持任意层次的多行结构列表(也即多行结构中的每个元素也可以是多行), name&multi_rows=1或者 *name 都可以表达一个多行解析的字段。
|
||||||
|
|
@ -579,6 +617,27 @@ xml中定义如下
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
<tr align="center">
|
||||||
|
<td>##+</td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td colspan="3">0</td>
|
||||||
|
<td colspan="3">1</td>
|
||||||
|
<td colspan="3">2</td>
|
||||||
|
</tr>
|
||||||
|
<tr align="center">
|
||||||
|
<td>##+</td>
|
||||||
|
<td/>
|
||||||
|
<td/>
|
||||||
|
<td>item_id</td><td>num</td><td>desc</td>
|
||||||
|
<td>item_id</td><td>num</td><td>desc</td>
|
||||||
|
<td>item_id</td><td>num</td><td>desc</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr align="center"><td/><td>1</td><td>task1</td><td>1</td><td>10</td><td>desc1</td><td>2</td><td>12</td><td>desc2</td><td>3</td><td>13</td><td>desc3</td></tr>
|
||||||
|
<tr align="center"><td/><td>2</td><td>task1</td><td>3</td><td>30</td><td>desc3</td><td>4</td><td>40</td><td>desc4</td></tr>
|
||||||
|
<tr align="center"><td/><td>3</td><td>task1</td><td>5</td><td>50</td><td>desc5</td></tr>
|
||||||
|
</table>
|
||||||
### 可空数据类型
|
### 可空数据类型
|
||||||
配置数据中经常有空值的语义需求,实际项目中往往混杂地使用0或-1表达空值,既不自然清晰也不统一。luban借鉴了c#中的可空变量的概念,特地提供可空数据支持。所有原生数据类型,以及enum、bean、和多态bean类型都有相应的可空数据类型。定义方式为 <类型名>?,与c#里的Nullable类型定义方式相同。例如 bool?,int?,long?,double?, EColor?, DemoType?
|
配置数据中经常有空值的语义需求,实际项目中往往混杂地使用0或-1表达空值,既不自然清晰也不统一。luban借鉴了c#中的可空变量的概念,特地提供可空数据支持。所有原生数据类型,以及enum、bean、和多态bean类型都有相应的可空数据类型。定义方式为 <类型名>?,与c#里的Nullable类型定义方式相同。例如 bool?,int?,long?,double?, EColor?, DemoType?
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -219,6 +219,8 @@ Options:
|
||||||
LogUtil.InitSimpleNLogConfigure(NLog.LogLevel.FromString(options.LogLevel));
|
LogUtil.InitSimpleNLogConfigure(NLog.LogLevel.FromString(options.LogLevel));
|
||||||
s_logger = NLog.LogManager.GetCurrentClassLogger();
|
s_logger = NLog.LogManager.GetCurrentClassLogger();
|
||||||
|
|
||||||
|
TimeZoneUtil.InitDefaultTimeZone("");
|
||||||
|
|
||||||
int processorCount = System.Environment.ProcessorCount;
|
int processorCount = System.Environment.ProcessorCount;
|
||||||
ThreadPool.SetMinThreads(Math.Max(4, processorCount), 5);
|
ThreadPool.SetMinThreads(Math.Max(4, processorCount), 5);
|
||||||
ThreadPool.SetMaxThreads(Math.Max(16, processorCount * 4), 10);
|
ThreadPool.SetMaxThreads(Math.Max(16, processorCount * 4), 10);
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,45 @@ namespace Luban.Common.Utils
|
||||||
{
|
{
|
||||||
public static class TimeZoneUtil
|
public static class TimeZoneUtil
|
||||||
{
|
{
|
||||||
|
private static readonly NLog.Logger s_logger = NLog.LogManager.GetCurrentClassLogger();
|
||||||
|
|
||||||
|
public static void InitDefaultTimeZone(string timeZoneName)
|
||||||
|
{
|
||||||
|
if (timeZoneName?.ToLower() == "local")
|
||||||
|
{
|
||||||
|
DefaultTimeZone = TimeZoneInfo.Local;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (timeZoneName?.ToLower() == "utc")
|
||||||
|
{
|
||||||
|
DefaultTimeZone = TimeZoneInfo.Utc;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (string.IsNullOrEmpty(timeZoneName))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
DefaultTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Asia/Shanghai");
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
DefaultTimeZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
s_logger.Error(ex);
|
||||||
|
throw new ArgumentException("The default timezone ID 'Asia/Shanghai' and 'China Standard Time' was not found on local computer. please set valid timezone manually.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DefaultTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static TimeZoneInfo DefaultTimeZone { get; set; } = TimeZoneInfo.Utc;
|
public static TimeZoneInfo DefaultTimeZone { get; set; } = TimeZoneInfo.Utc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,8 @@ namespace Luban.Server
|
||||||
[Option("disable_cache", Required = false, HelpText = "disable generation cache")]
|
[Option("disable_cache", Required = false, HelpText = "disable generation cache")]
|
||||||
public bool DisableCache { get; set; }
|
public bool DisableCache { get; set; }
|
||||||
|
|
||||||
[Option("i10n:default_timezone", Required = false, HelpText = "default timezone")]
|
[Option("i10n:default_timezone", Required = false, HelpText = "default timezone id. 'Asia/Shanghai', 'China Standard Time' eg. you can also use two special values: local,utc")]
|
||||||
public string L10nDefaultTimeZone { get; set; } = "Asia/Shanghai";
|
public string L10nDefaultTimeZone { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
|
|
@ -50,7 +50,7 @@ namespace Luban.Server
|
||||||
|
|
||||||
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
|
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
|
||||||
|
|
||||||
TimeZoneUtil.DefaultTimeZone = TimeZoneInfo.FindSystemTimeZoneById(options.L10nDefaultTimeZone);
|
TimeZoneUtil.InitDefaultTimeZone(options.L10nDefaultTimeZone);
|
||||||
|
|
||||||
GenServer.Ins.Start(false, options.Port, ProtocolStub.Factories);
|
GenServer.Ins.Start(false, options.Port, ProtocolStub.Factories);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue