【问题标题】:Can I store my DateTime in european notation?我可以用欧洲符号存储我的 DateTime 吗?
【发布时间】:2016-12-01 09:39:22
【问题描述】:

我正在尝试找到一种方法以欧洲表示法存储我的DateTime-object。现在,当我将文本框绑定到对象的DateTime-property 时,它显示为 MM/dd/yyyy HH:mm AM(或 PM)。我想以这种表示法保存它的原因是我不能通过ToString("dd/MM/yyyy HH:MM") 更改表示法,因为同样的属性也用于更新其他DateTime-properties。这将需要大量重写(每次我检索字符串以设置另一个对象的 DateTime,我都必须将TryParse 重新设置为DateTime-格式),所以我试图找出是否有办法将其保存为所需的符号。

一个显然行不通的例子,但让人思考,

public DateTime<dd/MM/yyyy HH:mm> ModifiedAt { get; set; }

我试着看看我是否可以强制它以这样的不同格式进行跟踪,

public DateTime ModifiedAt
    {
        get { return this.modifiedAt; }
        set
        {
            var s = value.ToString("dd/MM/yyyy HH:mm");
            DateTime.TryParse(s, out this.modifiedAt);
            this.RaisePropertyChanged();
        }
    }

但无济于事。由于我开始怀疑这是可能的,我很好奇是否有人以前遇到过这个问题。也许有一种方法可以改变绑定声明中的显示字符串?当我使用 MVVM 时,我将我的视图模型设置为 datacontext,我的绑定看起来像这样,

<TextBox Text="{Binding SelectedObject.ModifiedAt, Mode=OneWay}"/>

【问题讨论】:

  • 您是否尝试为当前线程(或当前的ui线程)设置culture
  • 不要以任何格式存储DateTimes,将它们存储为DateTime。当你想显示它们时格式化它们,f.e.与DateTime.ToStringDateTime 从来没有隐式格式,它只有一个值,就像一个数字。
  • @AliBahraminezhad 我对此进行了调查,但是(如果我理解正确的话)它的行为会不一致,因为我使用了很多 await Task.Run()
  • @TimSchmelter 好的,所以我应该研究如何让我的绑定调用 ToString 而我仍然可以让 MyObject.ModifiedAt 返回 DateTime-property?
  • 好的,你为什么不直接设置CultureInfo.DefaultThreadCurrentCultureCultureInfo.DefaultThreadCurrentUICulture 它对所有线程和任务都是全局的。我在这里写了一个答案stackoverflow.com/questions/40896455/…

标签: c# wpf datetime mvvm


【解决方案1】:

在 xaml 中格式化您的 DateTime 属性。

<TextBox Text="{Binding MyDateTimeProperty, StringFormat='dd/MM/yyyy HH:mm'}"/>

As explained here

【讨论】:

  • 因为我只是在写我自己的答案,因为我找到了一个类似的解决方案,我看到了你的。我将建议使用我找到的文章链接进行编辑
【解决方案2】:

要在不同的文化(例如欧洲)中显示DateTime,您需要为线程设置文化,并且由于您必须在应用程序中使用ThreadsTasks,因此您必须使用下面的代码来设置默认文化用于将来创建的所有线程和任务。

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("de-DE");

如果您只需要更改当前线程文化:

System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.DefaultThreadCurrentCulture;
System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.DefaultThreadCurrentCulture;

就像你一样,我有一个文本框:

<TextBox x:Name="textBox"/>

如果我将当前日期/时间设置为 Text 属性:

textBox.Text = DateTime.Now.ToString();

日期将显示为01.12.2016 13:27:58

我的 Windows 文化已设置为 en-us 格式,您可以看到 textbox 的值是 de-De 格式。

更新 1:

为了设置默认文化,我建议在App 类中创建一个新的构造函数,如下所示,我试过了,它可以工作。

public partial class App : Application
{       
    public App()
        :base()
    {
        CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");
        CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("de-DE");
    }

}

【讨论】:

  • 这可能是一个非常愚蠢的问题,但我在哪里编写前两行代码? (CultureInfo.Default .. 等)。现在我的构造函数中有它们,但它似乎没有任何改变?
  • @Ciphra CultureInfo.Default .. 仅适用于未来的线程而不是当前线程。
  • 是的,第二行(System.Threading .. 等)设置了当前的线程文化,但是当我在构造函数中设置这 4 行并运行我的应用程序时,没有任何变化。如我的帖子中所述,它仍以“en-US”格式显示。这是否与将DateTime 直接绑定到文本框而不是调用ToString() 有关?
  • @Ciphra 我更新了答案,请查看 Update1。
  • 我正在一个我没有直接访问权限的应用程序中构建一个模块。感谢您的帮助,但我似乎没有按照您描述的更新方式让它工作,而且您的更新在我的场景中根本不可能。盲人提供的答案以一种更简单、更直接的方式解决了我的问题。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 2011-12-23
  • 1970-01-01
  • 2011-09-28
相关资源
最近更新 更多