【问题标题】:Changing format of String.Format parameters at run time在运行时更改 String.Format 参数的格式
【发布时间】:2014-01-24 19:16:28
【问题描述】:

我以前的 LINQ 代码曾经有这样的东西:

DateOfBirth = string.Format("{0:MM/dd/yyyy}", myTable.DateOfBirth),

但现在我希望能够格式化用户如何从 Windows 更改他们的日期模式,所以我将其更改为这样并且它可以工作:

string regionShortDate = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
string temp = "{0:" + regionShortDate + "}";
DateOfBirth = string.Format(temp, myTable.DateOfBirth),

所以请注意我必须使用字符串连接来构建我的字符串格式化程序?我只是认为应该有一种更专业的方式来做到这一点。你有什么建议?

【问题讨论】:

标签: c# string-formatting


【解决方案1】:

使用DateTime.ToShortDateString方法

DateOfBirth = myTable.DateOfBirth.ToShortDateString();

ToShortDateString 方法返回的字符串是 文化敏感。它反映了当前定义的模式 文化的 DateTimeFormatInfo 对象。例如,对于 en-US 文化,标准的短日期模式是“M/d/yyyy”;对于 de-DE 文化,它是“dd.MM.yyyy”;对于 ja-JP 文化,它是“yyyy/M/d”。 特定计算机上的特定格式字符串也可以是 定制,使其不同于标准的短日期格式 字符串。

还有

当前 DateTime 对象的值使用 DateTimeFormatInfo.ShortDatePattern 属性定义的模式 与当前线程文化相关联。返回值为 与通过指定“d”标准返回的值相同 使用 ToString(String) 方法的 DateTime 格式字符串。

【讨论】:

  • 好的,现在试试,谢谢。但是昨天我遇到了我的代码说的像 DateTime.Now.ToString("MM/dd/yyyy") 这样的情况,而我想使用那个“ToShortDateString”,在这种情况下它没有按预期工作。不知道为什么
  • @DevWannaBe, ToShortDateString 将根据客户端计算机文化设置返回字符串。可能是 MM/dd/yyyydd/MM/yyyy,这就是您在问题中使用代码尝试做的事情
  • 哦,好吧,我读了你的帖子解释它,看到它说它使用“文化”,所以像“en-US”或“en-CA”......但这不是我想要的。在控制面板区域设置中,您仍然可以将其保留在美国,但将短日期模式更改为 yy/MM/dd,这样它就不会看到了。
  • @DevWannaBe, ToShortDateString 会为您提供与您的代码相同的输出,我刚刚在 VS 中尝试过,选择 yy-MM-dd 作为格式和 DateTime.Now.ToShortDateString() 返回 14-01-24
  • @DevWannaBe,你需要在调用该方法之前检查HasValue,否则你会得到一个无效的操作异常Nullable object must have a value.,但不是NRE。
【解决方案2】:

您可以按照 Habib 的建议使用 ToShortDateString

这取决于CultureInfo.CurrentCulture,因为虽然CultureInfo 拥有关于通常因语言和地区而异的问题的各种信息,但包括个人偏好。因此,对于我来说,虽然CurrentCulture.Name 返回en-IEDateTime.Now.ToShortDateString() 返回2014-01-24 而不是24/01/2014,因为使用从CultureInfo.GetCultureInfo("en-IE") 返回的对象会得到,因为我自己的装备设置为使用en- IE 用于语言,ISO 8601 用于日期和时间。

因此,不必担心当前文化和当前 UI 文化的名称仅与其语言相关;他们可以将UseUserOverride 设置为true,并且实际上是根据用户的设置构造的。

除了 Habib 的建议之外,如果您想使用当前的短日期字符串(或来自任何其他 CultureInfo 的字符串,您可以使用字符串 "d"。在短日期字符串为所有这些都被使用,但如果它是一个更大的短语的一部分,它会很有用:

string.Format("Today is {0:d}.", DateTime.Now)

(在我的系统上,Today is 2014-01-24. 在你的系统上,也许还有别的)。

还有其他useful single-string formatting strings for dates,可以类似使用。

编辑:

既然您刚刚指出您使用的是DateTime? 而不是DateTime,那么您有三个选择:

  1. 使用DateOfBirth = string.Format("{0:d}", myTable.DateOfBirth)。这会导致空字符串为空。
  2. 使用string.Format 测试无效性,例如DateOfBirth = myTable.DateOfBirth.HasValue ? string.Format("Born on {0:d}.", myTable.DateOfBirth.Value) : "Date of birth unknown";
  3. 使用ToShortDateString 测试无效性; DateOfBirth = myTable.DateOfBirth.HasValue ? myTable.DateOfBirth.ToShortDateString() : "Date of birth unknown";

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多