Преобразование значения временного интервала в формат «чч: мм 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 без даты, может быть, это не имеет значения, но вы привязываете сегодняшнюю дату, и это неправильно. Использование like string.Format (@ "{0: hh \: mm \: ss}", timespan) лучше, но я не
Я не
13

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

на .ToSTring("") :

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

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

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

Пример преобразования с 23:12 до 23: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();

подождите секунду, это не все, что вам нужно, чтобы заботиться о чем-то еще, это системная культура, потому что один и тот же код, выполняемый в окнах с другим языком, особенно с другим языком культуры, будет генерировать другой результат с тем же кодом

Пример окон, настроенных на культуру арабского языка, будет выглядеть следующим образом:

// 23:12 м

م означает Вечер (первое письмо مساء).

в другой системной культуре зависит от того, что установлено в региональных и языковых параметрах Windows, будет отображаться // 23:12 du.

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

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

Сюжет для арабского образца:

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 07
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 01
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 07
03:00 AMэто не «момент времени». Это «точка в день».
Alex
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 к файлу 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, а затем используйте Format ("чч: мм: 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
СТО
источник