Как я могу получить значение AM / PM из DateTime?

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()
    + " "
    ????????????????
}

как я могу получить AM / PM из dateTimeзначения?

SilverLight
источник
24
Есть гораздо лучшие способы форматирования, DateTimeчем это. См. Msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
ChrisF
Просто используйтеdateTime.ToString("tt");
Дэвид Иисус

Ответы:

368

Как насчет:

dateTime.ToString("tt", CultureInfo.InvariantCulture);
Энди
источник
3
Вам нужно добавить новый System.Globalization.CultureInfo ("en-US"), чтобы получить это право (если вы еще не запускаете поток в контексте США)
Томас
1
@thomas - Хороший вопрос. Отредактировано сейчас, чтобы указатьCultureInfo.InvariantCulture
Энди
8
ToString("tt", System.Globalization.CultureInfo.InvariantCulture)
Решения IndieTech
Это для получения AM / PM от даты. Но если я хочу изменить AM на PM в любой день. Тогда что мне делать?
Аджай Шарма
2
@AjaySharma Просто добавьте 12 часов до оценки формата. DateTime.Now.AddHours(12).ToString("tt", CultureInfo.InvariantCulture)
AXMIM
107
string.Format("{0:hh:mm:ss tt}", DateTime.Now)

Это должно дать вам строковое значение времени. TT должен добавить утра / вечера.

Вы также можете посмотреть на соответствующую тему:

Как вы получаете текущее время суток?

XikiryoX
источник
8
Это должно быть в нижнем регистре, так hhкак ваше текущее представление выводится через 24 часа с утра и вечера, что немного бессмысленно
не любил
1
@ LukeMcGregor Я исправил ответ в соответствии с вашим предложением.
Доктор Джонс
46

DateTimeВсегда должна быть внутренне в «американском» (григорианского) календаря. Так что если вы делаете

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

Вы должны получить то, что вы хотите, намного меньше.

Ксанатос
источник
33

Очень просто, используя формат строки

на .ToSTring("") :

  • если вы используете «чч» - >> Час, используя 12-часовые часы от 01 до 12.

  • если вы используете «ЧЧ» - >> Час, используя 24-часовые часы с 00 до 23.

  • если вы добавите "tt" - >> Обозначение Am / Pm.

пример преобразования из 23:12 в 11:12 вечера:

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 Words на английском языке, если культура текущей системы не установлена ​​на английский?

просто добавив две строки: ->

первый шаг добавить 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 => используя английский формат по умолчанию.

другой вопрос, я хочу, чтобы вечера были на арабском или конкретном языке, даже если я использую окна, настроенные на английский (или другой язык) региональный формат?

Soution for Arabic Exemple:

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 вечера"? Я думаю, что ваш ответ неполон.
Фьодр
18

Я знаю, что это может показаться слишком поздно .. однако это может помочь кому-то там

Я хотел получить часть AM PM, поэтому я использовал то, что посоветовал Энди:

dateTime.ToString("tt");

Я использовал эту часть, чтобы создать путь для сохранения моих файлов ... Я построил свои предположения, что я получу либо AM, либо PM, и ничего больше !!

однако, когда я использовал ПК, который по своей культуре не является английским .. (в моем случае ARABIC) .. мое приложение не удалось, потому что формат "tt" вернул что-то новое не AM или PM (م или ص) ..

Таким образом, решение этой проблемы было игнорировать культуру, добавив второй аргумент следующим образом:

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

.. конечно, вы должны добавить: использование System.Globalization; в верхней части вашего файла, я надеюсь, что это поможет кому-то :)

searchingSO
источник
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
Jamisco
источник
10
+ PC.GetHour(datetime) > 11 ? "pm" : "am"

Для вашего примера, но есть лучшие способы форматирования даты и времени.

Кевин Холдич
источник
Смотрите ссылку, которую @ChrisF дал выше. В основном вы можете использовать метод ToString для объекта datetime и передать его в формате. Таким образом, вы не вызываете datetime.ToString несколько раз, как в примере с кодом.
Кевин Холдич
2
Каким бы уродливым это ни казалось, это гораздо более простой и последовательный способ, чем возиться с разными культурами. Например, многие культуры показывают время в 24 часа и вообще не включают AM / PM, а ToString ("tt") создает пустую строку.
Натанчер
4

Нечто подобное bool isPM = GetHour() > 11. Но если вы хотите отформатировать дату в строку, вам не нужно делать это самостоятельно. Используйте для этого функции форматирования даты .

CodesInChaos
источник
1
Честно говоря, я бы даже не показал метод isPM (). THe только способ законно форматирование объектов DateTime используют форматтер.
richb01
@ richb01 Я не согласен. Единственный безопасный способ - вообще не использовать am / pm и использовать 24-часовой формат, всегда добавлять инвариантную культуру или делать это вручную. «am» и «pm» не заполнены, например, на немецком языке, они просто пусты. Если кто-то пишет String.Format ("{0: hh: mm tt}", DateTime.Now), он просто ошибается
Кристоф
1

Вы можете проверить это таким образом

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

Вывод будет таким:

AM

или

PM
yazarloo
источник
1
Вы знаете, что используете код принятого ответа?
Томас Аюб
Уважаемый @ThomasAyoub, написанный код взят из строки моего проекта. это работает прямо сейчас.
yazarloo
Извините, это очень плохой ответ, особенно потому что представляю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.
Джо Фаррелл