240

有问题的代码如下:

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?

4

15 回答 15

406

怎么样:

dateTime.ToString("tt", CultureInfo.InvariantCulture);
于 2011-10-24T12:06:44.027 回答
127
string.Format("{0:hh:mm:ss tt}", DateTime.Now)

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

您还可以查看相关主题:

您如何获得当前时间?

于 2011-10-24T12:05:50.123 回答
48

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

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

你应该在更少的行中得到你想要的。

于 2011-10-24T12:05:35.790 回答
48

使用字符串格式非常简单

.ToString("") :

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

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

  • 如果您添加“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 控制面板上的不同格式之间进行更改 -> 当前格式(组合框)并更改...应用它对您的应用程序进行重建(执行)并观看我在说什么。

那么如果当前系统的文化未设置为英语,我可以在英语事件中强制显示 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 م

如果我的系统设置为英语区域格式,则事件。如果您想要另一种语言格式,您可以更改“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...

如果您还有其他问题,请告诉我。

于 2015-07-22T18:34:36.003 回答
19

我知道这似乎为时已晚..但是它可能会帮助那里的人

我想得到日期的 AM PM 部分,所以我使用了 Andy 的建议:

dateTime.ToString("tt");

我用那部分来构造一个路径来保存我的文件。我建立了我的假设,即我会得到 AM 或 PM,没有别的!

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

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

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

..当然你必须添加:使用System.Globalization;在你的文件之上,我希望这会对某人有所帮助:)

于 2014-02-03T03:49:33.743 回答
15

它很简单

  Date someDate = new DateTime();
  string timeOfDay = someDate.ToString("hh:mm tt"); 
  // hh - shows hour and mm - shows minute - tt - shows AM or PM
于 2018-06-04T21:35:31.347 回答
10
+ PC.GetHour(datetime) > 11 ? "pm" : "am"

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

于 2011-10-24T12:01:56.393 回答
8

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

string.Format("{0:t tt}", datetime);  // -> "P PM"  or "A AM"
于 2011-10-24T12:07:07.233 回答
5

类似的东西bool isPM = GetHour() > 11。但是,如果您想将日期格式化为字符串,则不需要自己执行此操作。为此使用日期格式化功能。

于 2011-10-24T12:00:38.190 回答
2

@Andy 的回答是好的。但是,如果您想显示没有 24 小时格式的时间,那么您可以按照这种方式进行操作

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

在那之后,你应该得到像“10:35:20 PM”或“10:35:20 AM”这样的时间

于 2020-04-03T08:53:31.973 回答
1

另一种选择是更改用于获得正确格式的默认文化。优点是新格式将在整个代码中使用。

CultureInfo.CurrentCulture = new CultureInfo("Fr-fr");
Console.WriteLine(DateTime.Now.ToString("t")); // 14:08

var customCulture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
customCulture.DateTimeFormat.AMDesignator = "am";
customCulture.DateTimeFormat.PMDesignator = "pm";
customCulture.DateTimeFormat.ShortTimePattern = "HH:mm tt";
CultureInfo.CurrentCulture = customCulture;

Console.WriteLine(DateTime.Now.ToString("t")); // 14:08 pm
于 2021-03-11T13:15:54.030 回答
1

你可以这样测试

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

输出将是这样的:

AM

或者

PM
于 2016-05-30T10:13:28.773 回答
1

如果要向 LongDateString Date 添加时间,可以这样格式化:

    DateTime date = DateTime.Now;
    string formattedDate = date.ToLongDateString(); 
    string formattedTime = date.ToShortTimeString();
    Label1.Text = "New Formatted Date: " + formattedDate + " " + formattedTime;

输出:

New Formatted Date: Monday, January 1, 1900 8:53 PM 
于 2020-10-20T12:58:24.257 回答
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")
于 2015-11-19T14:30:19.897 回答
-2
string AM_PM = string.Format("{0:hh:mm:ss tt}", DateTime.Now).Split(new char[]{' '})[1];
于 2014-03-03T06:10:32.610 回答