TFormatSettings.Create('en-US')在不同平台上返回不同的设置

时间:2018-05-29 18:21:34

标签: delphi firemonkey

TFormatSettings.Create('en-US') Android 上以ShortDateFormat = 'm/d/yy'返回,但在 Windows 上返回ShortDateFormat = 'M/d/yyyy',这是正常的吗?这是一个错误吗?我当时认为设置必须与平台保持一致。

1 个答案:

答案 0 :(得分:5)

TFormatSetting尽可能使用特定于平台的设置,即使跨平台使用相同的区域设置也是如此。

在所有平台上,TFormatSettings.Create(LocaleName)LocalName转换为特定于平台的TLocaleID,然后调用TFormatSettings.Create(LocaleID)

在Windows上,LocaleName在Vista及更高版本上通过TLocaleID转换为LCID(唉LocaleNameToLCID()),在早期版本中转换为EnumSystemLocales()LCID的{​​{1}}为1033.如果Win32 API 'en-US'函数未返回指定{{1}的'm/d/yy'字符串,则GetLocaleInfo()是RTL的默认值}}。在您的系统上,Windows为LCID 1033返回LOCALE_SSHORTDATE,因此不使用RTL的默认值。

在Android上,RTL使用的底层本地化库是跨平台的ICU库,因此LocaleID只需将其编码为UTF-8即可转换为'M/d/yyyy',然后使用该库原样。如果ICU未为指定的LocalName返回TLocaleID字符串,则'm/d/y'是RTL的默认值。在您的系统上,ICU正在为UDAT_SHORT返回LocaleID,因此不会使用RTL的默认值。