DateTimeFormatInfo.DayNames returns Android 额外的,空的,日期名称
DateTimeFormatInfo.DayNames returns extra, empty, day name on Android
我得到了以下文化列表,我想用它们各自的语言获取它们的日期名称
CultureInfo[] newCultures = {new CultureInfo("de-DE"),
new CultureInfo("en-US"),
new CultureInfo("en-GB"),
new CultureInfo("es-ES"),
new CultureInfo("fr-FR"),
new CultureInfo("nl-NL")};
我遍历他们所有的DateTimeFormat.DayNames
并打印出来
foreach (CultureInfo culture in newCultures)
{
foreach (string day in culture.DateTimeFormat.DayNames)
{
Debug.Log(culture.Name + ": " + day);
}
Debug.Log("----------------");
}
当 运行 在 Windows 10 的编辑器中使用 Unity 2019.1.8f1,Mono .NET 4.x 等效运行时,使用 IL2CPP 脚本后端时,它按预期执行并打印所有来自 sun -> sat (inclusive) 在控制台中的日期名称。
不过,当我为 Android 构建时,事情开始变得混乱。
当 运行 在 Android 上使用完全相同的代码时(在 Android 7.0 和 Android 9.0 上测试)结果是不同的。
它不是只打印星期日 -> 星期六(含),而是为每种语言提供第 8 个条目。那是空的。
en-GB: Sunday
en-GB: Monday
en-GB: Tuesday
en-GB: Wednesday
en-GB: Thursday
en-GB: Friday
en-GB: Saturday
en-GB: <blank>
我用一堆语言(de-DE、en-US、en-EN、es-ES、fr-FR、nl-NL)尝试了这个,它们都产生了第 8 个空日。
然而,它并不止于此。当我遍历 CultureInfo.CurrentCulture
时,八天不存在。
foreach (string day in CultureInfo.CurrentCulture.DateTimeFormat.DayNames)
{
Debug.Log(CultureInfo.CurrentCulture.Name + ": " + day);
}
//Results
//en-GB: Sunday
//en-GB: Monday
//en-GB: Tuesday
//en-GB: Wednesday
//en-GB: Thursday
//en-GB: Friday
//en-GB: Saturday
除了使用 new CultureInfo
之外,我尝试使用 CultureInfo.CreateSpecificCulture
来代替,但这产生了与第 8 天空余一天相同的结果。
CultureInfo[] createCultures = {CultureInfo.CreateSpecificCulture("de-DE"),
CultureInfo.CreateSpecificCulture("en-US"),
CultureInfo.CreateSpecificCulture("en-GB"),
CultureInfo.CreateSpecificCulture("es-ES"),
CultureInfo.CreateSpecificCulture("fr-FR"),
CultureInfo.CreateSpecificCulture("nl-NL")};
foreach (CultureInfo culture in createCultures)
{
foreach (string day in culture.DateTimeFormat.DayNames)
{
Debug.Log(culture.Name + ": " + day);
}
Debug.Log("----------------");
}
这是预期的行为吗?如果是这样,为什么这第 8 天是空的?有没有办法不包括那一天而不必在之后删除它?
好像是Unity结合Android出现的问题(或者是Unity使用的Mono的具体版本,但我无法确定他们具体使用的是哪个版本,认为是修改后的版本)。
我在 Visual studio 中为 Android 应用程序构建了一个新的空 Xamarin,它没有问题 (mono version: --version Mono JIT compiler version 5.18.0 (Visual Studio built mono))
MainActivity.cs:
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
CultureInfo[] newCultures = {new CultureInfo("de-DE"),
new CultureInfo("en-US"),
new CultureInfo("en-GB"),
new CultureInfo("es-ES"),
new CultureInfo("fr-FR"),
new CultureInfo("nl-NL")};
List<string> results = new List<string>();
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
TextView text;
text = FindViewById<TextView>(Resource.Id.textView1);
foreach (CultureInfo culture in newCultures)
{
foreach (string day in culture.DateTimeFormat.DayNames)
{
results.Add(culture.Name + ": " + day + "\n");
text.Text += culture.Name + ": " + day + "\n";
}
text.Text += "--------\n";
}
//text.Text = results.;
}
}
Activity_main.axml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="Text"
android:textSize="5sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="25px"
android:minHeight="25px"
android:id="@+id/textView1" />
</LinearLayout>
这似乎是 Unity 2019.x 的 IL2CPP 脚本后端中的错误(已在 2019.1.8 和 2019.2.5 上测试)。将脚本后端设置回 Mono 解决了这个问题。我会用它做一个错误报告。
该错误并不仅限于 Android 和工作日。当试图获取月份的名称时,这还将包括末尾的空条目,导致一年有 13 个月。使用月份 Windows 时,构建也会受到影响,在 CurrentCulture
时也是如此。
奇怪的是,工作日不会在 windows 或使用 CurrentCulture
时显示此行为。
缩写版本的行为与其非缩写版本相同。
为它制作了一个展示回购 here
我得到了以下文化列表,我想用它们各自的语言获取它们的日期名称
CultureInfo[] newCultures = {new CultureInfo("de-DE"),
new CultureInfo("en-US"),
new CultureInfo("en-GB"),
new CultureInfo("es-ES"),
new CultureInfo("fr-FR"),
new CultureInfo("nl-NL")};
我遍历他们所有的DateTimeFormat.DayNames
并打印出来
foreach (CultureInfo culture in newCultures)
{
foreach (string day in culture.DateTimeFormat.DayNames)
{
Debug.Log(culture.Name + ": " + day);
}
Debug.Log("----------------");
}
当 运行 在 Windows 10 的编辑器中使用 Unity 2019.1.8f1,Mono .NET 4.x 等效运行时,使用 IL2CPP 脚本后端时,它按预期执行并打印所有来自 sun -> sat (inclusive) 在控制台中的日期名称。
不过,当我为 Android 构建时,事情开始变得混乱。
当 运行 在 Android 上使用完全相同的代码时(在 Android 7.0 和 Android 9.0 上测试)结果是不同的。
它不是只打印星期日 -> 星期六(含),而是为每种语言提供第 8 个条目。那是空的。
en-GB: Sunday
en-GB: Monday
en-GB: Tuesday
en-GB: Wednesday
en-GB: Thursday
en-GB: Friday
en-GB: Saturday
en-GB: <blank>
我用一堆语言(de-DE、en-US、en-EN、es-ES、fr-FR、nl-NL)尝试了这个,它们都产生了第 8 个空日。
然而,它并不止于此。当我遍历 CultureInfo.CurrentCulture
时,八天不存在。
foreach (string day in CultureInfo.CurrentCulture.DateTimeFormat.DayNames)
{
Debug.Log(CultureInfo.CurrentCulture.Name + ": " + day);
}
//Results
//en-GB: Sunday
//en-GB: Monday
//en-GB: Tuesday
//en-GB: Wednesday
//en-GB: Thursday
//en-GB: Friday
//en-GB: Saturday
除了使用 new CultureInfo
之外,我尝试使用 CultureInfo.CreateSpecificCulture
来代替,但这产生了与第 8 天空余一天相同的结果。
CultureInfo[] createCultures = {CultureInfo.CreateSpecificCulture("de-DE"),
CultureInfo.CreateSpecificCulture("en-US"),
CultureInfo.CreateSpecificCulture("en-GB"),
CultureInfo.CreateSpecificCulture("es-ES"),
CultureInfo.CreateSpecificCulture("fr-FR"),
CultureInfo.CreateSpecificCulture("nl-NL")};
foreach (CultureInfo culture in createCultures)
{
foreach (string day in culture.DateTimeFormat.DayNames)
{
Debug.Log(culture.Name + ": " + day);
}
Debug.Log("----------------");
}
这是预期的行为吗?如果是这样,为什么这第 8 天是空的?有没有办法不包括那一天而不必在之后删除它?
好像是Unity结合Android出现的问题(或者是Unity使用的Mono的具体版本,但我无法确定他们具体使用的是哪个版本,认为是修改后的版本)。
我在 Visual studio 中为 Android 应用程序构建了一个新的空 Xamarin,它没有问题 (mono version: --version Mono JIT compiler version 5.18.0 (Visual Studio built mono))
MainActivity.cs:
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
CultureInfo[] newCultures = {new CultureInfo("de-DE"),
new CultureInfo("en-US"),
new CultureInfo("en-GB"),
new CultureInfo("es-ES"),
new CultureInfo("fr-FR"),
new CultureInfo("nl-NL")};
List<string> results = new List<string>();
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
TextView text;
text = FindViewById<TextView>(Resource.Id.textView1);
foreach (CultureInfo culture in newCultures)
{
foreach (string day in culture.DateTimeFormat.DayNames)
{
results.Add(culture.Name + ": " + day + "\n");
text.Text += culture.Name + ": " + day + "\n";
}
text.Text += "--------\n";
}
//text.Text = results.;
}
}
Activity_main.axml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="Text"
android:textSize="5sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="25px"
android:minHeight="25px"
android:id="@+id/textView1" />
</LinearLayout>
这似乎是 Unity 2019.x 的 IL2CPP 脚本后端中的错误(已在 2019.1.8 和 2019.2.5 上测试)。将脚本后端设置回 Mono 解决了这个问题。我会用它做一个错误报告。
该错误并不仅限于 Android 和工作日。当试图获取月份的名称时,这还将包括末尾的空条目,导致一年有 13 个月。使用月份 Windows 时,构建也会受到影响,在 CurrentCulture
时也是如此。
奇怪的是,工作日不会在 windows 或使用 CurrentCulture
时显示此行为。
缩写版本的行为与其非缩写版本相同。
为它制作了一个展示回购 here