Ответ 1
TimeSpan
представляет временной интервал, а не время суток. Структура DateTime
более вероятно, что вы ищете.
У меня есть данные TimeSpan, представленные в виде 24-часового формата, такие как 14:00:00, я хочу преобразовать его в 12-часовой формат, 2:00 PM, я googled и нашел что-то связанное в stackoverflow и msdn, но didn Решить эту проблему, может ли кто-нибудь мне помочь? Спасибо заранее.
Обновление Кажется, что можно конвертировать 24-часовой формат TimeSpan в String, но невозможно преобразовать строку в 12-часовой формат TimeSpan: (
Но у меня все еще есть МНОГО хороших ответов, спасибо!
TimeSpan
представляет временной интервал, а не время суток. Структура DateTime
более вероятно, что вы ищете.
(Подводя мои разрозненные комментарии в один ответ.)
Сначала вам нужно понять, что TimeSpan
представляет временной интервал. Этот интервал времени внутренне представляется как количество тиков, а не строка 14:00:00
, а строка 2:00 PM
. Только когда вы преобразовываете TimeSpan
в строку, имеет смысл говорить о двух разных представлениях строк. Переход от одного представления к другому не изменяет или не конвертирует количество тиков, хранящихся в TimeSpan
.
Время записи 2:00 PM
вместо 14:00:00
относится к форматированию даты и времени и культуре. Все это обрабатывается классом DateTime
.
Однако, хотя TimeSpan
представляет временной интервал, он вполне подходит для представления времени суток (DateTime.TimeOfDay
возвращает a TimeSpan
). Поэтому нецелесообразно использовать его для этой цели.
Для выполнения описанного форматирования вам нужно либо полагаться на логику форматирования DateTime
, либо просто создать свой собственный код форматирования.
Использование DateTime
:
var dateTime = new DateTime(timeSpan.Ticks); // Date part is 01-01-0001
var formattedTime = dateTime.ToString("h:mm tt", CultureInfo.InvariantCulture);
Спецификаторы формата, используемые в ToString
, описаны на странице Пользовательские строки даты и времени на MSDN. Важно указать CultureInfo
, который использует желаемый обозначение AM/PM. В противном случае спецификатор формата tt
может быть заменен пустой строкой.
Использование пользовательского форматирования:
var hours = timeSpan.Hours;
var minutes = timeSpan.Minutes;
var amPmDesignator = "AM";
if (hours == 0)
hours = 12;
else if (hours == 12)
amPmDesignator = "PM";
else if (hours > 12) {
hours -= 12;
amPmDesignator = "PM";
}
var formattedTime =
String.Format("{0}:{1:00} {2}", hours, minutes, amPmDesignator);
По общему признанию, это решение довольно сложнее, чем первый метод.
Вам нужно сначала преобразовать TimeSpan в объект DateTime, а затем использовать любой формат DateTime:
var t = DateTime.Now.TimeOfDay;
Console.WriteLine(new DateTime(t.Ticks).ToString("hh:mm:ss tt"));
ToShortTimeString()
также будет работать, но он зависит от региональных настроек, поэтому он не будет отображаться правильно (или правильно, в зависимости от того, как вы его видите) в неамериканских системах.
TimeSpan
представляет собой временной интервал (разность между временами),
а не дату или время, поэтому нет смысла определять ее в формате 24 или 12 часов. Я предполагаю, что вы действительно хотите DateTime
.
Например, сегодня 2 PM:
TimeSpan ts = TimeSpan.FromHours(14);
DateTime dt = DateTime.Today.Add(ts);
Затем вы можете отформатировать эту дату так, как хотите:
String formatted = String.Format("{0:d/M/yyyy hh:mm:ss}", dt); // "12.4.1012 02:00:00" - german (de-DE)
http://msdn.microsoft.com/en-us/library/az4se3k1%28v=vs.100%29.aspx
Попробуйте этот код:
int timezone = 0;
Эта строка дает 12-часовой формат
string time = DateTime.Now.AddHours(-timezone).ToString("hh:mm:ss tt");
Эта строка дает 24-часовой формат
string time = DateTime.Now.AddHours(-timezone).ToString("hh:mm:ss tt");
Предполагая, что вы находитесь в 24-часовом диапазоне, вы можете добиться того, чего хотите, вычитая отрицательный TimeSpan
из Today DateTime
(или любой даты, если на то пошло), затем разделите часть даты:
DateTime dt = DateTime.Today;
dt.Subtract(-TimeSpan.FromHours(14)).ToShortTimeString();
Доходность:
2:00 PM
String formatted = yourDateTimeValue.ToString("hh:mm:ss tt");
Это очень просто. Предположим, у нас есть объект ts of TimesSpan: TimeSpan ts = new TimeSpan();
и предположим, что оно содержит какое-то значение, например 14:00:00. Теперь сначала преобразуйте это в строку, а затем в DateTime следующим образом:
TimeSpan ts = new TimeSpan(); // this is object of TimeSpan and Suppose it contains
// value 14:00:00
string tIme = ts.ToString(); // here we convert ts into String and Store in Temprary
// String variable.
DateTime TheTime = new DateTime(); // Creating the object of DateTime;
TheTime = Convert.ToDateTime(tIme); // now converting our temporary string into DateTime;
Console.WriteLine(TheTime.ToString(hh:mm:ss tt));
Результат будет показан как: 02:00:00 PM