c# - WPF 中的日期时间格式

标签 c# wpf

我想根据环境中的当前文化自动显示日期时间。

例如 如果我使用 DateTime.ToShortDateString() 转换“May 4 2013”​​的Datetime,它将是 4/5/2013 in -us 和 5/4/2013en-gb 中。

但是我想显示的是 en-us 中的 04/05/2013 和 en-gb 中的 05/04/2013。零无法隐藏。

请注意,该软件可能在不同的文化中运行,而不仅仅是在美国和英国。我不想为每种文化设置日期时间格式。

最佳答案

鉴于 .NET 对每种文化的格式应该有自己的想法,除了决定“改进”现有格式之外,您无能为力。

我要做的是创建一个 IValueConverter,我将在其中采用当前(或所需)文化的短日期格式:

CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern

并将所有出现的单个 d 替换为 dd

如果您要求月份为两位数,年份为四位数,我会将单个 M 替换为 MM 并确保始终有四个 的。

这种方法利用了 .NET 认为在每种文化中正确的日期-月份-年份顺序,并使用了 .NET 认为正确的分隔符。

转换器可能看起来像这样:

class ShortDateConverter : IValueConverter
{
  public object Convert(object data, Type type, object parameter, CultureInfo culture)
  {
    string format = PrepareFormat(culture.DateTimeFormat.ShortDatePattern);

    DateTime date = (DateTime)data;

    return date.ToString(format, culture);
  }

  public object ConvertBack(object data, Type type, object parameter, CultureInfo culture)
  {
    return DateTime.ParseExact((string)data, PrepareFormat(culture.DateTimeFormat.ShortDatePattern), culture);
  }

  private string PrepareFormat(string format)
  {
    if (!format.Contains("dd"))
      format = format.Replace("d", "dd");

    if (!format.Contains("MM"))
      format = format.Replace("M", "MM");

    if (!format.Contains("yyyy"))
      format = format.Replace("yy", "yyyy");

    return format;
  }
}

关于c# - WPF 中的日期时间格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16806857/

相关文章:

c# - 是否可以将自定义 header 添加到 ServiceStack Redis 消息中?

c# - .NET TreeNode 能否知道它的父级已更改?

c# - 寻找如何添加调整大小按钮

c# - 如何在 'InputBindings'元素中正确执行 'Border'?

wpf - 在客户端上不安装任何东西的情况下显示报告的最佳方式是什么

c# - 如何将CSS类添加到MVC中的 Action 链接

c# - 来自 Try block 的 "returning"的性能

c# - 第二个 for 循环没有在我的更新中运行

wpf - 从 WPF 中的窗口更改 UserControl 上文本框的文本值

wpf - Treeview MVVM ObservableCollection 更新