在C#中格式化日期/时间

4

我有一个日期/时间字符串,看起来像这样:

Wed Sep 21 2011 12:35 PM Pacific

我该如何将 DateTime 格式化为这样的样式呢?

谢谢!


1
我经常使用这位大佬的备忘单:http://blog.stevex.net/string-formatting-in-csharp/ - Dave Ziegler
3
它是否总是太平洋时区?因为我不相信.NET DateTime格式化会给出时区名称。 - Jon Skeet
4个回答

9

时区前面的位很容易,使用自定义日期和时间格式字符串即可:

string text = date.ToString("ddd MMM dd yyyy hh:mm t");

然而,我认为.NET日期/时间格式化将不会提供“Pacific”的部分。 它能提供的最好结果只是与UTC的时区偏移量。 如果你可以以其他方式获取时区名称,那就没问题了。
许多TimeZoneInfo标识符包含单词太平洋,但没有一个是仅“Pacific”。

1
给出24小时制和AM/PM不是有点多余吗? :P - Brandon
+1和偏移量为-8并不总是表示太平洋时区 - 许多命名时区共享相同的偏移量,而DateTime / DateTimeOffset不存储它。 - Paul Stovell
@Brandon:是的,当然有可能它仍然是24小时制——我们无法确定。(当然,日期格式中已经包含了星期几的名称,这是一种冗余。) - Jon Skeet
@Paul:你这是对牛弹琴 :) 话虽如此,即便是Noda Time也不会只有“太平洋”作为时区标识... - Jon Skeet

6
string.Format("{0} {1}", DateTime.Now.ToString("ddd MMM dd yyyy HH:mm tt"), TimeZone.CurrentTimeZone.StandardName);
//Result: Wed Sep 07 2011 14:29 PM Pacific Standard Time

如果您不想显示标准时间,请将其修剪掉。

编辑: 如果您需要在多个地方执行此操作,还可以扩展DateTime以包括一个方法来为您执行此操作。

void Main()
{
    Console.WriteLine(DateTime.Now.MyCustomToString());
}

// Define other methods and classes here
public static class DateTimeExtensions
{
    public static string MyCustomToString(this DateTime dt)
    {
        return string.Format("{0} {1}", DateTime.Now.ToString("ddd MMM dd yyyy HH:mm tt"), TimeZone.CurrentTimeZone.StandardName).Replace(" Standard Time", string.Empty);
    }
}

您可以直接复制并在程序模式下在LinqPad中运行此示例。

更新说明

根据下方的评论,这是更新后的版本。

void Main()
{
    Console.WriteLine(DateTime.Now.MyCustomToString());
}

// Define other methods and classes here
public static class DateTimeExtensions
{
    public static string MyCustomToString(this DateTime dt)
    {
        return string.Format("{0:ddd MMM dd yyyy hh:mm tt} {1}", DateTime.Now, TimeZone.CurrentTimeZone.StandardName).Replace(" Standard Time", string.Empty);
    }
}

1
没有必要同时混合使用String.Format和ToString。您可以在一个调用中完成所有操作: String.Format("{0:ddd MMM dd yyyy HH:mm tt} {1}", DateTime.Now, TimeZone.CurrentTimeZone.StandardName) - Joel Mueller
哦,糟糕。12小时制的时间应该是hh而不是HH - Joel Mueller

5

2
请注意,以下翻译可能有些粗略,但可以帮助你找到正确的方向。
结合Jon提到的内容,我们需要进一步探讨:
string text = date.ToString("ddd MMM dd yyyy hh:mm t");

然后加入以下类似的内容:
    TimeZone localZone = TimeZone.CurrentTimeZone;
    string x = localZone.StandardName.ToString();
    string split = x.Substring(0,7);
    string text = date.ToString("ddd MMM dd yyyy hh:mm t") + " " + split;

我没有测试过,但希望它能有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接