如何从DateTime中获取AM/PM值?

251

以下是相关的代码:

public static string ChangePersianDate(DateTime dateTime)
{
    System.Globalization.GregorianCalendar PC = new System.Globalization.GregorianCalendar();
    PC.CalendarType = System.Globalization.GregorianCalendarTypes.USEnglish;
    return
    PC.GetYear(dateTime).ToString()
    + "/"
    + PC.GetMonth(dateTime).ToString()
    + "/"
    + PC.GetDayOfMonth(dateTime).ToString()
    + ""
    + PC.GetHour(dateTime).ToString()
    + ":"
    + PC.GetMinute(dateTime).ToString()
    + ":"
    + PC.GetSecond(dateTime).ToString()
    + " "
    ????????????????
}

如何从 dateTime 值中获取 AM/PM?


27
有比这种方式更好的格式化 DateTime 的方法。请参见 http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx。 - ChrisF
1
只需使用dateTime.ToString("tt"); - David Jesus
15个回答

427

如何尝试:

dateTime.ToString("tt", CultureInfo.InvariantCulture);

3
您需要添加新的 System.Globalization.CultureInfo("en-US") 才能得到正确的结果(如果您还没有在美国上下文中运行线程)。 - thomas
2
@thomas - 很好的观点。现在已经编辑,指定为CultureInfo.InvariantCulture - Andy
9
ToString("tt", System.Globalization.CultureInfo.InvariantCulture) - IndieTech Solutions
这是从日期中获取上午/下午的代码。但如果我想将任何日期中的上午改为下午,该怎么办? - Ajay Sharma
2
@AjaySharma 只需在格式评估之前添加12小时。DateTime.Now.AddHours(12).ToString("tt", CultureInfo.InvariantCulture) - AXMIM
请记住,如果您想将时间从下午改为上午,您需要减去12个小时而不是加上12个小时,假设您希望保留相同的日期。 - Triynko

138
string.Format("{0:hh:mm:ss tt}", DateTime.Now)

这应该会给你时间的字符串值。它应该会添加上午/下午。

您还可以查看相关主题:

如何获取当前时间?


12
请将此内容翻译为中文: 这应该是小写的“hh”,因为您当前的表示法在24小时制中输出上午和下午,这有点无意义。 - undefined
1
@LukeMcGregor 根据您的建议,我已经修改了答案。 - Doctor Jones
我点赞了这个回答并踩了被采纳的回答,因为它没有解释任何东西。这个回答讲得通,另一个则不然。 - jamheadart
@jamheadart 哈哈,那个被接受的答案几乎是十年前就完美地回答了OP的问题。他们只需要将答案复制粘贴到问号上方的空格中即可。 - mcalex
已回答,但没有解释。对于新手来说,使用“tt”和CultureInfo.InvariantCulture并不是自我说明的。即使是一行代码,也应该有解释。 - jamheadart

59

使用字符串格式非常简单

.ToString("") : 上:

  • 如果您使用 "hh" ->> 小时,使用12小时制从01到12。

  • 如果您使用 "HH" ->> 小时,使用24小时制从00到23。

  • 如果您添加 "tt" ->> 上午/下午指示器。

例如将 23:12 转换为 11:12 Pm:

DateTime d = new DateTime(1, 1, 1, 23, 12, 0);
var res = d.ToString("hh:mm tt"); // this shows 11:12 PM
var res2 = d.ToString("HH:mm");   // this shows 23:12

Console.WriteLine(res);
Console.WriteLine(res2);

Console.Read();

等一下,这不是你需要关心的全部,还有另外一个需要关注的问题就是系统文化,因为相同的代码在Windows上执行时,使用不同的语言和文化将会生成不同的结果。

例如,将Windows设置为阿拉伯语文化,将显示如下内容:

// 23:12 م

“م”表示晚上(“مساء”第一个字母)。

在另一个系统文化中,取决于Windows区域和语言选项的设置,它将显示// 23:12 du。

您可以在Windows控制面板中更改不同的格式,在Windows区域和语言 ->当前格式(组合框)下进行更改...应用它并重新构建(执行)您的应用程序,看看我在说什么。

那么,即使当前系统的文化不是英语,我该如何强制显示英语中的AM和PM单词?

很容易,只需添加两行:

第一步,将using System.Globalization;添加到您的代码顶部

然后将先前的代码修改为以下内容:

DateTime d = new DateTime(1, 1, 1, 23, 12, 0);
var res = d.ToString("HH:mm tt", CultureInfo.InvariantCulture); // this show  11:12 Pm

InvariantCulture => 使用默认的英语格式。

我想让 PM 以阿拉伯语或特定语言显示,即使我使用的是设置为英语(或其他语言)区域格式的 Windows?

阿拉伯语示例的解决方案:

DateTime d = new DateTime(1, 1, 1, 23, 12, 0);
var res = d.ToString("HH:mm tt", CultureInfo.CreateSpecificCulture("ar-AE")); 

这将显示 // 23:12 م

即使我的系统设置为英语区域格式,也可以显示。

如果您想更改“ar-AE”以使用其他语言格式,则可以查看每种语言及其格式的列表。

例如:

ar          ar-SA       Arabic
ar-BH       ar-BH       Arabic (Bahrain)
ar-DZ       ar-DZ       Arabic (Algeria)
ar-EG       ar-EG       Arabic (Egypt)

big list...

如果你有其他问题,请让我知道。


如果我想看到“11:12 PM”?我认为你的答案不完整。 - Fjodr

50

DateTime 在内部始终应使用“美国”(公历) 日历。因此,如果您执行以下操作:

var str = dateTime.ToString(@"yyyy/MM/dd hh:mm:ss tt", new CultureInfo("en-US"));

你可以用更少的代码实现你想要的效果。


19

我知道这可能有些晚了...但这可能会对某些人有所帮助

我想获取日期的上午下午部分,所以我使用了Andy建议的方法:

dateTime.ToString("tt");

我使用那个部分构建路径来保存我的文件。 我假设我只会得到AM或PM而不会有其他结果!

然而,当我在一个文化不是英语的PC上使用时...(在我这种情况下是阿拉伯语)..我的应用程序失败了,因为格式“tt”返回了一些新的东西,既不是AM也不是PM(م或ص)。

所以解决这个问题的方法是通过添加第二个参数来忽略文化,如下所示:

dateTime.ToString("tt", CultureInfo.InvariantCulture);

当然,您需要在文件顶部添加:using System.Globalization; 我希望这能帮助到某个人 :)


3
谢谢你添加这个,它今天帮了我 - 在我的开发环境中是 A.M.,而在远程服务器上是 AM,谷歌并没有提供太多的帮助,直到我读了这篇文章。甚至 Dotnetpearls 还说“在 tt 的输出中没有句号。如果您需要 AM 或 PM 中的句号,您需要操作字符串。”当然,在我的情况下完全不是这样... - KiwiSunGoddess

16

非常简单

  Date someDate = new DateTime();
  string timeOfDay = someDate.ToString("hh:mm tt"); 
  // hh - shows hour and mm - shows minute - tt - shows AM or PM

10
+ PC.GetHour(datetime) > 11 ? "pm" : "am"

对于您的示例,但有更好的方式来格式化日期时间。


请查看@ChrisF提供的链接。基本上,您可以在datetime对象上使用ToString方法并传递一个格式。这样,您就不需要像在代码示例中那样多次调用datetime.ToString。 - Kevin Holditch
2
虽然这看起来很丑陋,但与不同的文化搞混比起来,这是一种更简单、更一致的方式。例如,许多文化在24小时制下显示时间,并且根本不包括AM/PM,ToString("tt")会产生一个空字符串。 - nathanchere

9

来源: http://www.csharp-examples.net/string-format-datetime/

在 IT 技术中,字符串格式化是一项重要的任务。它涉及将一个变量(例如日期和时间)转换为特定格式的字符串。这个网站提供了一些关于如何使用 C# 语言对日期和时间进行格式化的例子和解释。

string.Format("{0:t tt}", datetime);  // -> "P PM"  or "A AM"

5

类似于bool isPM = GetHour() > 11。但是,如果您想将日期格式化为字符串,您不需要自己处理。使用日期格式化函数即可。


1
说实话,我甚至不会展示isPM()方法。合法格式化DateTime对象的唯一方式是使用格式化程序。 - richb01
@richb01 我不同意。唯一安全的方法是完全不使用上午/下午,而是使用24小时制,始终附加不变文化或手动执行。例如,在德语中,“am”和“pm”没有填写,它们只是空的。如果有人编写String.Format("{0:hh:mm tt}", DateTime.Now),他们将得到错误的时间。 - Christoph

3
@Andy的答案还可以,但如果你想显示非24小时格式的时间,可以按照以下方式进行
string dateTime = DateTime.Now.ToString("hh:mm:ss tt", CultureInfo.InvariantCulture);

接下来,您应该获得类似于“10:35:20 PM”或“10:35:20 AM”的时间。


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