Як отримати значення 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значення?


24
Є набагато кращі способи форматування формату a, 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"), щоб отримати це право (якщо ви вже не запускаєте нитку в контексті США)
thomas

1
@thomas - хороший момент. Відредаговано зараз для уточненняCultureInfo.InvariantCulture
Енді,

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

Це для отримання AM / PM від дати. Але якщо я хочу змінити AM на будь-яку дату. Тоді що мені робити?
Аджай Шарма

2
@AjaySharma Просто додайте 12 годин до оцінювання формату. DateTime.Now.AddHours(12).ToString("tt", CultureInfo.InvariantCulture)
AXMIM

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

Це повинно дати вам значення строки часу. tt слід додати am / pm.

Ви також можете переглянути відповідну тему:

Як ви отримуєте поточний час доби?


8
Це має бути нижчим регістром, hhоскільки ваше поточне представлення виходить за 24 години з ранку та вечора, що трохи безглуздо
Не любив

1
@LukeMcGregor Я змінив відповідь відповідно до вашої пропозиції.
Доктор Джонс

46

Це DateTimeзавжди повинно бути внутрішньо в "американському" (григоріанському) календарі. Так що якщо ви робите

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

ви повинні отримати те, що ви хочете, у набагато менше рядків.


33

Дуже просто, використовуючи формат рядка

на .ToSTring("") :

  • якщо ви використовуєте "hh" - >> Година, використовуючи 12-годинний годинник від 01 до 12.

  • якщо ви використовуєте "HH" - >> Година, використовуючи цілодобовий годинник від 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();

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

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

Суспіт для арабського прикладу:

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...

повідомте мене, якщо у вас є інше питання.


Якщо я хочу побачити "23:12"? Я думаю, що ваша відповідь неповна.
Fjodr

18

Я знаю, що це може здатися дуже пізнім .. однак це може допомогти комусь там

Мені хотілося отримати частину дати AM PM, тому я використав те, що радив Енді:

dateTime.ToString("tt");

Я використав цю частину для побудови Шляху для збереження моїх файлів .. Я створив свої припущення, що я отримаю або AM, або PM та нічого іншого !!

Однак, коли я використовував ПК, його культура не є англійською .. (в моєму випадку ARABIC) .. моє додаток не вдалося, оскільки формат "tt" повернув щось нове не AM чи PM (م або or) ..

Тому виправленням цього було ігнорування культури, додавши другий аргумент наступним чином:

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

.. звичайно, вам доведеться додати: використання 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") створює порожню рядок.
натанхер


4

Щось подібне bool isPM = GetHour() > 11. Але якщо ви хочете відформатувати дату в рядку, вам не потрібно робити це самостійно. Використовуйте для цього функції форматування дати .


1
Чесно кажучи, я навіть не показав метод isPM (). THe тільки спосіб законно форматування об'єктів DateTime використовують форматтер.
richb01

@ richb01 Я не згоден. Єдиний безпечний спосіб - взагалі не використовувати am / pm та використовувати формат 24h, завжди додавати інваріантну культуру чи робити це вручну. "am" і "pm" не заповнюються, наприклад, німецькою мовою, це просто порожньо. Якщо хтось пише String.Format ("{0: hh: mm tt}", DateTime.Now), вони просто помиляються
Крістоф

1

Ви можете перевірити це таким чином

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

Вихід буде таким:

AM

або

PM

1
Чи знаєте ви, що використовуєте код прийнятої відповіді?
Томас Аюб

Шановний @ThomasAyoub, Код, який написано, походить із рядка мого джерела проекту. вона працює зараз.
yazarloo

Вибачте, це дуже погана відповідь, тим більше, що вступNow
Вовк

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 вечора" або "10:35:20 ранку"



-2

Ось приклад коду:

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

2
Це не надійне рішення. ToLongTimeString()повертає значення на основі поточної культури потоку. І на відміну від деяких подібних рішень, наведених в інших відповідях, цей код навіть не буде працювати, якщо ви встановите культуру потоків InvariantCulture, оскільки інваріантна культура LongTimePattern- це те, що визначає повернене значення ToLongTimeString()- HH:mm:ss.
Джо Фаррелл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.