【问题标题】:What is a less Kludgy way to Conditionally Prepend a "0" to dateTime Elements?有条件地在 dateTime 元素前添加“0”的不那么 Kludgy 的方法是什么?
【发布时间】:2014-03-31 16:23:36
【问题描述】:

我希望我的字符串 YearMonthDayHourMinuteSecondMillisecond 采用这种格式(必要时添加“0”):

20140227142807

...但是这个:

string YearMonthDayHourMinuteSecond = string.Format("{0}{1}{2}_{3}{4}{5}", dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second);

...给我“2”(而不是“02”)表示二月等,例如:

2014227142807

我可以这样解决:

string YearMonthDayHourMinuteSecondMillisecond = string.Format("{0}{1}{2}_{3}{4}{5}{6}", dt.Year, ConditionalZeroForepad(dt.Month), ConditionalZeroForepad(dt.Day), ConditionalZeroForepad(dt.Hour), ConditionalZeroForepad(dt.Minute), ConditionalZeroForepad(dt.Second);

private string ConditionalZeroForepad(string s)
{
   if (s.Length < 2)
   {
       return string.Format("0{1}", s);   
   }
}

...但这比一袋烟头丑 9 倍。

有什么更优雅的方式来实现这一点?

【问题讨论】:

  • 我认为仅变量名YearMonthDayHourMinuteSecondMillisecond 就已经“比一袋烟头丑九倍”。
  • 可能 8.3 左右,但绝对不是 9!

标签: c# datetime padding date-formatting prepend


【解决方案1】:

您需要使用如下字符串格式:

var str = string.Format("{0:D2}", 2);

str 的值:02

D2 部分告诉格式化程序确保格式化后的数字中至少有两位数。 See this MSDN page for more on Custom Numeric Format Strings

但是为DateTime.ToString 提供日期时间格式是一个更好的解决方案,然后尝试从各个部分组成您想要的格式。

【讨论】:

    【解决方案2】:
    string YearMonthDayHourMinuteSecondMillisecond = dt.ToString("yyyyMMddHHmmss")
    

    【讨论】:

    • 是的,但是发帖者的示例代码也是如此,真的应该更正变量名:)
    • 是的,刚刚注意到。已编辑我的答案以提供两种形式并评论变量名称与示例不匹配...
    【解决方案3】:

    根本不要使用string.Format - 使用DateTime.ToString()

    string text = dt.ToString("yyyyMMddHHmmssfff", CultureInfo.InvariantCulture);
    

    或者只需要几秒钟:

    string text = dt.ToString("yyyyMMddHHmmss", CultureInfo.InvariantCulture);
    

    (您的变量名称表明您需要毫秒,但您的示例表明您不需要。)

    注意使用CultureInfo.InvariantCulture 以确保您始终使用公历,即使线程的当前文化是具有不同默认日历的文化。 (显然,如果您想要不同的日历,那就另当别论了。)

    更多信息请参见custom date and time format strings

    【讨论】:

    • 是的,你抓住了我 - 我想要毫秒,但从 一些 示例代码中删除了它以尝试简化它,因为我认为现在是 Noda 时间展示那个。
    • @B.ClayShannon:很明显,我不会阻止您使用 Noda Time :)(您可以在 Noda Time 中使用完全相同的代码,尽管我鼓励您使用...Pattern,为了清楚起见。)
    • 现在每次听到“Tulsa Time”这首歌,都会发生这种情况:myBrain.Replace("Tulsa", "Noda");
    【解决方案4】:

    您可以将 ToString() 与格式参数一起使用,例如 dt.Month.ToString("D2")

    【讨论】:

      猜你喜欢
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 2017-12-21
      • 2011-04-28
      • 1970-01-01
      • 2022-01-18
      • 2019-08-27
      相关资源
      最近更新 更多