将System.Globalization.DateTimeFormatInfo短日期格式转换为Windows.Globalization.DateTimeFormatting.DateTimeFormatter

时间:2018-08-30 18:36:56

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

我在UWP中使用CalendarDatePicker控件。日期的格式应本地化为用户选择的区域性,不一定与OS语言设置相同。我希望日期格式与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属性,但效果不明显。

2 个答案:

答案 0 :(得分:1)

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

Languageshortdate DateFormat属性不同,日期格式也可能不同。您可以使用 zh-CN fr-FR 语言查看不同的内容。

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

因此,您可能需要使用CultureInfo类来获取当前的区域性。

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

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
        }

答案 1 :(得分:0)

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

<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的简单转换)