【问题标题】:DateTimeFormatInfo.DayNames returns extra, empty, day name on AndroidDateTimeFormatInfo.DayNames 在 Android 上返回额外的、空的、日期名称
【发布时间】:2020-01-20 07:59:31
【问题描述】:

我得到了以下文化列表,我想用它们各自的语言获取日期名称

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("----------------");
}

当在带有 Unity 2019.1.8f1、Mono .NET 4.x 运行时等效的 Windows 10 上的编辑器中运行此程序时,使用 IL2CPP 脚本后端,它会按预期执行并打印来自 sun -> sat(包括)的所有日期名称控制台。

不过,当我为 Android 构建时,事情开始变得一团糟。

在 Android 上运行完全相同的代码(在 Android 7.0 和 Android 9.0 上测试)时,结果会有所不同。

不仅仅是打印天数 sun -> sat(包括),它对每种语言都有第 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才出现的问题(或者是Mono Unity使用的具体版本,但是我无法确定他们到底用的是哪个版本,认为是修改版)。


我在 Visual Studio 中构建了一个新的空 Xamarin for Android 应用程序,它没有问题 (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>

【问题讨论】:

  • 您的项目数组中有什么?
  • 在您进行编辑更改之后。
  • 代码在我的 Net 4.0 上运行。帖子中缺少变量“item”,然后您将其更改为文化。
  • 我明白了,我的借口。我现在已经解决了这个问题。那是在Android版本上吗?因为我在 Windows 上没有遇到过这个问题。我使用单声道 --version Mono JIT compiler version 5.18.0 (Visual Studio built mono) 创建了一个新的 Xamarin Android 应用程序,它似乎没有添加空条目。所以这似乎是一个 Unity 结合 Android 的具体问题

标签: c# android unity3d mono cultureinfo


【解决方案1】:

这似乎是 Unity 2019.x 的 IL2CPP 脚本后端中的一个错误(在 2019.1.8 和 2019.2.5 上测试)。将脚本后端设置回 Mono 可以解决此问题。我将对此进行错误报告。

该错误不仅限于 Android 和工作日。当试图获取月份的名称时,这也将包括最后的空条目,导致一年有 13 个月。使用几个月时,Windows 版本以及CurrentCulture 也会受到影响。

奇怪的是,工作日在 Windows 上或使用 CurrentCulture 时不会显示此行为。

缩写版本的行为与其非缩写版本相同。

为它制作了一个展示回购here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 2019-01-25
    相关资源
    最近更新 更多