【问题标题】:Convert System.Globalization.DateTimeFormatInfo short date format to Windows.Globalization.DateTimeFormatting.DateTimeFormatter将 System.Globalization.DateTimeFormatInfo 短日期格式转换为 Windows.Globalization.DateTimeFormatting.DateTimeFormatter
【发布时间】:2018-08-30 18:36:56
【问题描述】:

我在 UWP 中使用 CalendarDatePicker 控件。日期的格式应本地化为用户选择的文化,这不一定与操作系统语言设置相同。我希望日期格式与 myCultureInfo.DateTimeFormat.ShortDatePattern 相同(例如 mm/dd/yyyy)。 CalendarDatePicker 公开了 DateFormat 属性,该属性的格式应类似于 {month.integer}‎/‎{day.integer}‎/‎{year.full}。我需要一个用于 XAML 绑定的转换器。似乎应该有一个简单的方法来做到这一点。

<!-- In XAML -->
<CalendarDatePicker
    FirstDayOfWeek="{x:Bind ViewModel.CalendarFirstDayOfWeek, Mode=OneTime, Converter={StaticResource SystemDayOfWeekToWindowsDayOfWeekConverter}}"
    DateFormat="{x:Bind ViewModel.DateFormat, Mode=OneWay, Converter={StaticResource DateTimeFormatToDateTimeFormatterTemplateConverter}"
    Date="{x:Bind ViewModel.Date, Mode=TwoWay, Converter={StaticResource DateTimeToDateTimeOffsetConverter}}"/>

//Converter
public class DateTimeFormatToDateTimeFormatterTemplateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        //What goes here?
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

编辑: 理想情况下,CalendarDatePicker 将只有一个 CultureInfo 属性来处理所有这些。我尝试了 Language 属性,但没有明显效果。

【问题讨论】:

  • 需要自己转换。得到ShortDatePattern值后,可以根据该值转换CalendarDatePicker的DateTimeFormatter,如ShortDatePattern="M/d/yyyy"则指定DateFormat="shortdate"
  • @BreezeLiu-MSFT 你能用代码示例澄清一下吗? CalendarDatePicker 的 DateTimeFormatter 未公开公开,因此我无法在其上设置 ShortDatePattern。看起来我只能访问 DateFormat 属性,然后将其传递给 DateTimeFormatter 构造函数。我也尝试过这样的事情:Language="en-UK" DateFormat="shortdate",但它不起作用。
  • 更正:“en-UK”不是有效的语言代码。如果我使用有效的语言代码并明确设置日期格式(例如“en-GB”)并绑定一周的第一天,它就可以工作。但是,所有这些仍然没有本地化日历弹出窗口中的月份名称。

标签: localization datetime-format uwp-xaml globalization cultureinfo


【解决方案1】:

是的,您通过使用CalendarDatePickerDateFormat 属性来设置CalendarDatePickerDateTimeFormatter,该属性告诉DateTimeFormatter 如何通过提供格式模板或字符串来格式化值一种格式模式。 Language 属性用于获取或设置适用于CalendarDatePicker 的本地化/全球化语言信息。

不同的Languageshortdate DateFormat 属性可能也有不同的日期格式。您可以通过 en-USfr-FR 语言看到不同之处。

<StackPanel>
    <CalendarDatePicker Language="en-US" DateFormat="shortdate"/>
    <CalendarDatePicker Language="fr-FR" DateFormat="shortdate"/>
</StackPanel>

因此您可能需要使用CultureInfo 类来获取当前文化。

对于DateFormat 转换,您可以从设备设置应用程序中获取所有ShortTimePattern:设置=> 时间和语言=> 数据和时间=> 更改日期和时间格式,在短日期 部分,您可以在那里看到所有格式。然后可以根据ShortTimePattern返回对应的DateFormat字符串。以下是一些代码示例:

var shortDataPattern = CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern;
Debug.WriteLine(shortDataPattern);
        switch (shortDataPattern)
        {
            case "M/d/yyyy":
                // return "shortdate" or the following
                return "{}{month.integer}‎/‎{day.integer}‎/‎{year.full}";
            case "M/d/yy":
                return ...
            ...//Other format
        }

【讨论】:

  • 谢谢。我真的很想避免为每种可能的日期格式编写 switch 语句。我发现如果我同时设置 Language 和 DateFormat 属性,它将本地化​​日期格式。我没想到必须明确设置 DateFormat。但是,现在的问题是当我设置 Language 属性时月份名称没有本地化。有什么建议吗?
【解决方案2】:

对于在这里冒险的任何人,这至少会本地化日期格式和一周的第一天,但​​它不会本地化月份的名称:

<CalendarDatePicker
    Language="{x:Bind ViewModel.CalendarLanguageCode, Mode=OneWay}"
    FirstDayOfWeek="{x:Bind ViewModel.CalendarFirstDayOfWeek, Mode=OneTime, Converter={StaticResource SystemDayOfWeekToWindowsDayOfWeekConverter}}"
    DateFormat="shortdate"
    Date="{x:Bind ViewModel.Date, Mode=TwoWay}"/>

(SystemDayOfWeekToWindowsDayOfWeekConverter 的实现是从 System.DayOfWeek 到 Windows.Globalization.DayOfWeek 的简单转换)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2016-12-02
    • 2023-03-30
    • 2011-08-13
    相关资源
    最近更新 更多