我有一个值存储在类型变量中System.TimeSpan
,如下所示。
System.TimeSpan storedTime = 03:00:00;
我可以将它重新存储在另一个类型String
的变量中吗?
String displayValue = "03:00 AM";
如果storedTime
变量的值为
storedTime = 16:00:00;
那么它应该转换为:
String displayValue = "04:00 PM";
您可以通过将时间跨度添加到日期来做到这一点。
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"
使用字符串格式非常简单
上.ToSTring("") :
如果你使用 "hh" ->> 小时,使用从 01 到 12 的 12 小时制。
如果你使用 "HH" ->> 小时,使用 00 到 23 的 24 小时制。
如果您添加“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 前
م 表示晚上(مساء 的第一个字母)。
在设置为德语的 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 => 使用默认的英文格式。
另一个问题我想让 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 阿拉伯语(埃及).....
您可以添加TimeSpan
到 a 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
在这里做一些捎带现有的答案:
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();
}
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 o'clock 的值,但表示是二进制的,TimeSpan 不能记录 和 之间的16:00
差异4 pm
。
您将需要DateTime
从您的对象中获取一个对象TimeSpan
,然后您可以轻松地对其进行格式化。
一种可能的解决方案是将时间跨度添加到任何时间值为零的日期。
var timespan = new TimeSpan(3, 0, 0);
var output = new DateTime().Add(timespan).ToString("hh:mm tt");
输出值将是"03:00 AM"
(对于英语语言环境)。
您不能将AM/PM添加到TimeSpan
. 如果您想以 12 小时制格式显示时间,则无论如何都必须将TimaSpan
值与相关联。DateTime
TimeSpan
不打算与 12 小时时钟格式一起使用,因为我们在这里讨论的是时间间隔。
正如它在文档中所说的那样;
一个
TimeSpan
对象表示一个时间间隔(持续时间或经过的时间),它被测量为天数、小时数、分钟数、秒数和秒数的正数或负数。该TimeSpan
结构还可用于表示一天中的时间,但前提是时间与特定日期无关。否则,应使用DateTime
or结构。DateTimeOffset
Microsoft Docs也描述如下;
值
TimeSpan
可以表示为[-]d.hh:mm:ss.ff
,其中可选的减号表示负时间间隔,d
分量是天,是在24 小时制hh
上测量的小时,是分钟,是秒,是秒的几分之一。mm
ss
ff
因此,在这种情况下,您可以使用 AM/PM 进行如下显示。
TimeSpan storedTime = new TimeSpan(03,00,00);
string displayValue = new DateTime().Add(storedTime).ToString("hh:mm tt");
旁注:
还应注意TimeOfDay的属性DateTime
是 a TimeSpan
,它代表
一个时间间隔,表示自午夜以来已过去的一天中的部分。
将时间跨度解析为 DateTime,然后使用 Format ("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"
为避免时间跨度格式限制,请转换为日期时间。最简单的表达方式是:
// Where value is a TimeSpan...
(new DateTime() + value).ToString("hh:mm tt");
你可以试试这个:
string timeexample= string.Format("{0:hh:mm:ss tt}", DateTime.Now);
您可以根据需要删除 hh 或 mm 或 ss 或 tt,其中 hh 是 12 小时甲酸盐中的小时,mm 是分钟,ss 是秒,tt 是 AM/PM。
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;
}
首先,您需要将时间跨度转换为 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
因为这种情况很烦人,因为它很常见......我创建了一个助手类,我已经在 NuGet 包中发布了它。这可能是一个私有方法,可以在 MVC 视图以及后端 C# 代码中使用。
public static string AsTimeOfDay(TimeSpan timeSpan, TimeSpanFormat timeSpanFormat = TimeSpanFormat.AmPm)
{
int hours = timeSpan.Hours;
int minutes = timeSpan.Minutes;
string AmOrPm = "AM";
string returnValue = string.Empty;
if (timeSpanFormat == TimeSpanFormat.AmPm)
{
if (hours >= 12)
{
AmOrPm = "PM";
}
if (hours > 12)
{
hours -= 12;
}
TimeSpan timeSpanAmPm = new TimeSpan(hours, minutes, 0);
returnValue = timeSpanAmPm.ToString(@"h\:mm") + " " + AmOrPm;
}
else
{
returnValue = timeSpan.ToString(@"h\:mm");
}
return returnValue;
}