如何从DateTime获取AM / PM值?


204

有问题的代码如下:

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 ?


24
格式化a的方法要好得多DateTime。参见msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
ChrisF

只需使用dateTime.ToString("tt");
David Jesus

Answers:


368

怎么样:

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

3
您需要添加新的System.Globalization.CultureInfo(“ en-US”)才能获得正确的权限(如果您尚未在美国上下文中运行线程)
thomas

1
@thomas-好点。现在编辑以指定CultureInfo.InvariantCulture
Andy

8
ToString("tt", System.Globalization.CultureInfo.InvariantCulture)
IndieTech Solutions

从日期开始获取AM / PM。但是,如果我想在任何日期将AM更改为PM。那我该怎么办?
Ajay Sharma

2
@AjaySharma只需在格式评估前12小时添加。DateTime.Now.AddHours(12).ToString("tt", CultureInfo.InvariantCulture)
AXMIM

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

这应该给您时间的字符串值。tt应该附加上午/下午。

您还可以查看相关主题:

您如何获得一天中的当前时间?


8
这应该是小写字母,hh因为您当前的表示形式会在24小时内以am和pm输出,这是毫无意义的
不喜欢

1
@LukeMcGregor我已根据您的建议修改了答案。
2014年

46

DateTime应始终内部在“美国”日历(Gregorian)。所以如果你这样做

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

您应该在更少的行中得到想要的东西。


33

使用字符串格式非常简单

.ToSTring("") :

  • 如果您使用“ hh”->>小时,则使用从12到01的12小时制时钟。

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

  • 如果添加“ tt”->> Am / Pm指示符。

示例从23:12转换为11:12 Pm:

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

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

Console.Read();

稍等片刻,这不是您需要关心的所有事情,而是系统文化,因为在Windows上与其他语言一起执行的相同代码,特别是在具有不同文化语言的情况下,将产生具有相同代码的不同结果

设置为阿拉伯语言文化的窗户示例将显示为:

// 23:12م

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

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

您可以在Windows区域和语言下的Windows控制面板上的不同格式之间进行切换->当前格式(组合框),然后更改...应用它来重新构建(执行)您的应用并观看iam所讨论的内容。

如果>>当前系统的文化未设置为英语,那么谁可以强制在英语事件中显示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设置为阿拉伯语或特定语言吗?

以阿拉伯语为例:

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

这将显示// 23:12م

如果我的系统设置为英语区域格式,则为event。如果需要其他语言格式,则可以更改“ 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

18

我知道这似乎太晚了..但是它可能会帮助某个人

我想获得该日期的AM PM,所以我使用了Andy的建议:

dateTime.ToString("tt");

我用那部分构造了一个保存文件的路径。

但是,当我使用PC的文化不是英语时..(在我的情况下为阿拉伯语)..我的应用程序失败,因为格式“ tt”返回了新的内容,而不是AM或PM(م或ص)。

因此,解决此问题的方法是通过添加第二个参数来忽略区域性:

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

..当然,您必须添加:using System.Globalization; 在您的文件上,我希望对您有所帮助:)


3
感谢您添加此消息,因为它对我今天有帮助-我在开发环境中获得了AM,在远程服务器上获得了AM,直到我阅读本文,Google并没有提供大量帮助。甚至Dotnetpearls都说:“ tt的输出中没有句点。如果在AM或PM中需要句点,则必须操作该字符串。” 在我的情况下,哪一个当然是完全不正确的……
KiwiSunGoddess

13

非常简单

  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给出的链接。基本上,您可以在日期时间对象上使用ToString方法并将其传递给格式。这样,您就不会像在代码示例中那样调用datetime.ToString多次。
凯文·霍尔迪奇

2
尽管看起来很丑陋,但是它是比混搭不同文化更为简单和一致的方法。例如,许多文化显示的时间都是24小时,根本不包含AM / PM,而ToString(“ tt”)会生成一个空字符串。
nathanchere


4

有点像bool isPM = GetHour() > 11。但是,如果要将日期格式化为字符串,则无需自己执行此操作。为此使用日期格式功能。


1
老实说,我什至不会显示isPM()方法。该以合法形式datetime对象的方法是使用格式化。
2012年

@ richb01我不同意。唯一安全的方法是完全不使用am / pm并使用24h格式,始终附加不变文化或手动进行。“ am”和“ pm”未用德语填写,只是空的。如果有人写String.Format(“ {0:hh:mm tt}”,DateTime.Now),他们的时间就错了
Christoph

1

您可以通过这种方式进行测试

Console.WriteLine(DateTime.Now.ToString("tt "));

输出将如下所示:

AM

要么

PM

1
您知道您正在使用接受的答案的代码吗?
Thomas Ayoub

亲爱的@ThomasAyoub,所编写的代码来自我项目源代码的一行。它现在正在工作。
yazarloo '16

抱歉,这是一个非常差的答案,尤其是因为引入Now
Wolf,

0

(hh:mm:ss tt)如果您愿意,这是一种更简单的方法,您可以编写时间格式并单独显示它们。

string time = DateTime.Now.Hour.ToString("00") + ":" + DateTime.Now.Minute.ToString("00") + ":" + DateTime.Now.Second.ToString("00") + DateTime.Now.ToString(" tt");

或者只是:

 DateTime.Now.ToString("hh:mm:ss tt")

0

@安迪的答案是好的。但是,如果您想显示没有24小时格式的时间,则可以按照以下方式进行操作

string dateTime = DateTime.Now.ToString("hh:mm:ss tt", CultureInfo.InvariantCulture);

之后,您应该有时间像“ 10:35:20 PM”或“ 10:35:20 AM”


-1
string AM_PM = string.Format("{0:hh:mm:ss tt}", DateTime.Now).Split(new char[]{' '})[1];

-2

这是一些示例代码:

DateTime time = DateTime.Now;
string AM_PM;
AM_PM = time.ToLongTimeString().Substring(time.ToLongTimeString().Length - 2);

2
这不是一个可靠的解决方案。ToLongTimeString()返回基于当前线程区域性的值。并且与其他答案中提供的某些类似解决方案不同,如果将线程区域性设置为,则该代码甚至无法工作InvariantCulture,因为LongTimePattern确定区域性不变的区域性-决定了其返回值ToLongTimeString()-is HH:mm:ss
Joe Farrell
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.