Перетворити значення часового проміжку у формат "hh: mm Am / Pm" за допомогою C #


82

У мене значення зберігається у змінній типу System.TimeSpanнаступним чином.

System.TimeSpan storedTime = 03:00:00;

Чи можу я повторно зберегти його в іншій змінній типу Stringнаступним чином?

String displayValue = "03:00 AM";

І якщо storedTimeзмінна має значення

storedTime = 16:00:00;

тоді його слід перетворити на:

String displayValue = "04:00 PM";

Відповіді:


191

Ви можете зробити це, додавши свій час до дати.

TimeSpan timespan = new TimeSpan(03,00,00);
DateTime time = DateTime.Today.Add(timespan);
string displayTime = time.ToString("hh:mm tt"); // It will give "03:00 AM"

чи можна додати час за замовчуванням із цього засобу вибору дати завантаження, наприклад datepicker value + TimeofDay:?
Shaiju T

1
Зверніть увагу, що це завжди дасть 12-годинний час годинника з префіксом AM / PM. Якщо ви хочете, щоб результат відповідав даній культурі, ShortTimePatternзамість цього ви можете використовувати :string displayTime = time.ToString("t" [, culture]);
Sphinxxx

1
Або ви можете просто зателефонуватиtime.ToShortTimeString()
Мардок

time.ToShortTimeString () не підтримує попереднє значення 0 за 15:00. time.ToString ("hh: mm tt") подбає про це
Souvik Basu

Я хочу TimeSpan без будь-якої дати, можливо, це не має значення, але ви прив'язуєте сьогоднішню дату, і це неправильно. Використовуючи як string. Не знаю, як до цього додати AM / PM :(
QMaster

13

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

на .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();

зачекайте секунду, це ще не все, що вам потрібно, щоб піклуватися про щось інше - це система Культура, тому що той самий код, який виконується на вікнах з іншими мовами, особливо з різною культурою, створює різні результати з тим самим кодом

зразок вікон, встановлених на культуру арабської мови, буде виглядати так:

// 23:12 м

م означає Вечір (перший лист від مساء).

в іншій системі культура залежить від того, що встановлено у вікні регіональної та мовної опції, це буде показано // 23:12 дю.

Ви можете переключатись між різними форматами на панелі керування 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 арабська ar-BH ar-BH арабська (Бахрейн) ar-DZ ar-DZ арабська (Алжир) ar-EG ar-EG арабська (Єгипет)


5
Запитання про TimeSpan. Ця відповідь для DateTime.
thelem

11

Ви можете додати TimeSpanдо DateTime, наприклад:

TimeSpan span = TimeSpan.FromHours(16);
DateTime time = DateTime.Today + span;
String result = time.ToString("hh:mm tt");

Демонстрація: http://ideone.com/veJ6tT

04:00 PM

Стандартні рядки формату дати та часу


дякую, через кілька годин я намагався, 11:57 pmі це спрацювало: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
Shaiju T

10
string displayValue="03:00 AM";

Це момент часу , а не тривалість (TimeSpan).

Отже, щось не так з вашим базовим дизайном або припущеннями.

Якщо ви все-таки хочете ним скористатися, спочатку вам доведеться перетворити його на DateTime (момент часу). Ви можете відформатувати DateTime без частини дати, яка була б вашим бажаним рядком.

TimeSpan t1 = ...;
DateTime d1 = DateTime.Today + t1;               // any date will do
string result = d1.ToString("hh:mm:ss tt");

Змінна storeTime може мати значення типу
storeTime=16:00:00;

Ні, воно може мати значення 4 години, але подання є двійковим, TimeSpan не може записати різницю між 16:00і 4 pm.


11
Прикро, що DateTime.TimeOfDayповертає TimeSpan- Microsoft веде вас до цього дизайну :(
Джон Скіт

2
@JonSkeet Я не знаю, що це найгірший дизайн (і я знаю, що ти підступний у цьому питанні, з повагою, враховуючи твою роботу над Noda), це справа розуміння обмежень інтерпретації. Не існує поняття родича DateTime, якби це було, то це ("03:00 AM") було б просто прикладом цього. Однак я бачу, що для більшості випадків використання цей дизайн (відносний DateTime) надмірно ускладнює проблеми (звичайно, це відбувається за рахунок ускладнення виконання дуже конкретної роботи навколо дат, часу, абсолютних чи ні) , часові пояси тощо)
casperOne

7
@casperOne: По суті, він використовує один тип для представлення інформації, яка логічно зберігається в іншому типі, просто тому, що якщо ти досить жорстко примружиш, вони виглядають схожими. Я б не пропонував перевантажувати сенс DateTimeще більше (це вже досить погано). Повинен бути тип, що представляє "час доби" - це, звичайно, саме те, що я реалізував у Noda Time. Всякий раз, коли ви намагаєтесь вкласти безліч різних концепцій у невелику кількість типів, у вас неодмінно виникають такі проблеми.
Джон Скіт,

1
Ця відповідь чудова, оскільки вона пояснює, чому TimeSpan поводиться так, як це робить, а не просто те, як вирішити проблему. На насправді має бути три типи: DateTime, TimeOfDayі Date.
thelem

03:00 AMне є "моментом часу". Це "точка за день".
Олексій

10

Виконайте деякі відмови від існуючих відповідей тут:

public static string ToShortTimeSafe(this TimeSpan timeSpan)
{
    return new DateTime().Add(timeSpan).ToShortTimeString();
} 

public static string ToShortTimeSafe(this TimeSpan? timeSpan)
{
    return timeSpan == null ? string.Empty : timeSpan.Value.ToShortTimeSafe();
}

3
Це найчесніша відповідь
toddmo

9

Вам потрібно буде отримати DateTimeоб’єкт із вашого, TimeSpanа потім ви зможете легко його відформатувати.

Одним із можливих рішень є додавання інтервалу часу до будь-якої дати з нульовим значенням часу.

var timespan = new TimeSpan(3, 0, 0);
var output = new DateTime().Add(timespan).ToString("hh:mm tt");

Вихідним значенням буде "03:00 AM"(для англійської мови).


6

Ви не можете додати AM / PM до a TimeSpan. Вам все одно доведеться асоціювати TimaSpanзначення з тим, DateTimeякщо ви хочете відобразити час у форматі годинника 12 годин.

TimeSpanне призначений для використання з 12-годинним форматом годинника, оскільки тут ми говоримо про часовий інтервал .

Як сказано в документації ;

TimeSpanОб'єкт являє собою інтервал часу (тривалість часу або пройденого часу) , яка вимірюється в якості позитивного або негативного числа днів, годин, хвилин, секунд і часток секунди. TimeSpanСтруктура також може бути використана для представлення часу доби, але тільки якщо час НЕ має ніякого відношення до певної дати. В іншому випадку замість цього слід використовувати структуру DateTimeor DateTimeOffset.

Також Microsoft Docs описує наступне;

TimeSpanЗначення може бути представлено в вигляді [-]d.hh:mm:ss.ff, де необов'язковий знак мінус вказує на негативний інтервал часу, то dкомпонент днів, hhце годин , як виміряно на 24-годинному , mmзнаходиться в декількох хвилинах, ssсекундах, і ffстановить частки секунди.

Отже, у цьому випадку ви можете відображати за допомогою AM / PM наступним чином.

TimeSpan storedTime = new TimeSpan(03,00,00);
string displayValue = new DateTime().Add(storedTime).ToString("hh:mm tt");


Примітка :
Також слід зазначити, що властивість TimeOfDayDateTime є a TimeSpan, де воно представляє

інтервал часу , який являє собою частину дня, що минув з півночі.


3

Проаналізуйте проміжок часу на DateTime, а потім скористайтеся форматом ("hh: mm: tt"). Наприклад.

TimeSpan ts = new TimeSpan(16, 00, 00);
DateTime dtTemp = DateTime.ParseExact(ts.ToString(), "HH:mm:ss", CultureInfo.InvariantCulture);
string str = dtTemp.ToString("hh:mm tt");

str буде:

str = "04:00 PM"

2

Ви можете спробувати це:

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

Ви можете видалити hh або mm або ss або tt відповідно до вашої потреби, де hh - це година через 12 годин формату, mm - хвилини, ss - секунди, tt - AM / PM.


1
Parse timespan to DateTime. For Example.    
//The time will be "8.30 AM" or "10.00 PM" or any time like this format.
    public TimeSpan GetTimeSpanValue(string displayValue) 
        {   
            DateTime dateTime = DateTime.Now;
                if (displayValue.StartsWith("10") || displayValue.StartsWith("11") || displayValue.StartsWith("12"))
                          dateTime = DateTime.ParseExact(displayValue, "hh:mm tt", CultureInfo.InvariantCulture);
                    else
                          dateTime = DateTime.ParseExact(displayValue, "h:mm tt", CultureInfo.InvariantCulture);
                    return dateTime.TimeOfDay;
                }

0

Спочатку потрібно перетворити проміжок часу в структуру DateTime:

var dt = new DateTime(2000, 12, 1, timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds)

Потім вам потрібно перетворити значення у рядок у форматі Короткий час

var result = dt.ToString("t"); // Convert to string using Short Time format
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.