【问题标题】:How to format a date/time value according to the system's regional format on Windows Phone 8.1?如何在 Windows Phone 8.1 上根据系统的区域格式格式化日期/时间值?
【发布时间】:2015-02-22 15:12:28
【问题描述】:

我正在 C#/XAML 上开发 Windows Phone 8.1 应用程序,我需要根据用户的区域格式偏好设置时间值列表的格式。例如,对于这张图片上的设置,我必须使用葡萄牙语(巴西)的格式来格式化时间值。

问题是,日期/时间 API 根据应用程序的语言/地区格式化时间和日期。因为我的应用有一个“en-US”资源文件并且系统语言设置为英语,API 选择“en-US”作为我的应用的语言并根据这种文化格式化所有内容。

是否有任何方法可以覆盖此行为并使用用户在系统设置中定义的区域格式?

我能找到的最接近的东西是Windows.System.UserProfile.GlobalizationPreferences.Clocks,它是用户首选的时钟列表。但它只返回一个值为“24HourClock”的字符串,没有格式模式或任何东西。

【问题讨论】:

    标签: c# .net localization windows-phone windows-phone-8.1


    【解决方案1】:

    试试这个:

    CultureInfo ci = new CultureInfo("pt-BR");
    DateTime dt = DateTime.Now;
    String strDate = dt.ToString("D", ci);
    String strTime = dt.ToString("t", ci);
    String strCurr = ci.NumberFormat.CurrencySymbol;
    

    要获取当前文化的 CultureInfo,请尝试:

    CultureInfo ci = CultureInfo.CurrentUICulture;
    

    要获取当前区域的 CultureInfo,请尝试:

    CultureInfo ci = new CultureInfo(Globalization.RegionInfo.CurrentRegion.Name);
    

    【讨论】:

    • 您的示例已硬编码葡萄牙语,但我仅作为示例提及。我想获取用户在设置中定义的任何区域格式设置。
    • 我明白了,但是您知道一种方法来检索系统设置中定义的区域格式的适当字符串吗?
    • 不,仍然是美国。但是,我在调试器上检查了CultureInfo 类的属性,并且有一个名为UserDefaultCulture 的非公共成员返回“pt-BR”,这显然是我需要的!虽然它不是公共财产,所以我无法从我的应用程序中访问它:(
    • Store 应用程序 API 不支持 Thread 类(但我怀疑它无论如何都会返回 en-US,因为那 我目前的文化 - 不是我的区域格式设置)
    • 仍然没有骰子。我做了一些测试,似乎 Nextgen Reader 找到了一种方法。我会尝试与开发人员取得联系,看看他是如何做到的。如果我从他那里回来,我会在这里发帖。
    【解决方案2】:

    区域格式在 Windows Phone Silverlight 堆栈中行为正确(恕我直言),但在 WinRT 堆栈中行为不正确(仍然是恕我直言)。自 Windows 8.0 以来,它一直表现不佳,这里对此问题进行了长时间的讨论:WinRT apps and Regional settings. The correct way to format dates and numbers based on the user's regional settings?

    我最近也写了一篇关于这个问题的博文:http://mikaelkoskinen.net/winrt-xaml-misbehave-still-in-windows-81/

    博客文章还包含一个似乎可以正常工作的解决方法:您可以将 Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride 设置为用户的区域格式,以使事情更好地工作。

    因此,希望 App.xaml.cs 的构造函数中的以下代码证明是有用的:

        public App()
        {
            Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = Windows.System.UserProfile.GlobalizationPreferences.HomeGeographicRegion;
            this.InitializeComponent();
            this.Suspending += this.OnSuspending;
        }
    

    更新为替代版本

    另一种选择是使用 GlobalizationPreferences.Languages-array。例如:

            Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = Windows.System.UserProfile.GlobalizationPreferences.Languages[1];
    

    只需确保检查数组中实际上有超过 1 种语言即可。

    这是设置 PrimaryLanguageOverride 后它在应用中的外观:

                this.DateText.Text = DateTime.Now.ToString("D");
    

    更新了屏幕截图

    在 Windows Phone 8.1 中,如果您通过设置更改区域格式,所选的区域格式将被添加为第二语言。至少这是 8.1 模拟器的工作方式。因此,当我从头开始启动模拟器并更改区域设置时:

    然后如果我重新启动手机,所选区域已添加为第二语言:

    现在 Windows.System.UserProfile.GlobalizationPreferences.Languages 包含我选择的区域格式。

    【讨论】:

    • 您好,感谢您的回答!不幸的是,您的代码没有帮助...HomeGeographicRegion 返回“美国”(即国家/地区)并且日期/时间以美国方式格式化:1drv.ms/1zeQYxd。为什么微软认为让用户选择不同于其国家/地区默认的区域格式并让应用程序开发人员自己弄清楚如何在他们的项目中使用它是一个好主意,我无法理解。
    • 我添加了一个替代选项,希望对您有所帮助。
    • 新代码根据手机的第二语言格式化日期,这是另一回事。我想要的是根据您在“设置”>“区域”中设置的 区域格式 来格式化日期。它与手机的语言无关。
    • 感谢您的评论。我添加了更多信息。
    • 哦,我没有意识到操作系统做到了!感谢您的澄清。这种方法对我不起作用,因为我前段时间添加了德语作为一种语言,它显示为第二语言。所以这不是确定区域格式设置的可靠方法......无论如何,这对我的应用程序来说是一个小问题。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    相关资源
    最近更新 更多