将时间跨度值转换为“格式”;hh:mm Am/Pm“;使用C#
我在将时间跨度值转换为“格式”;hh:mm Am/Pm“;使用C#,c#,.net,C#,.net,我在System.TimeSpan类型的变量中存储了一个值,如下所示 System.TimeSpan storedTime = 03:00:00; TimeSpan storedTime = new TimeSpan(03,00,00); string displayValue = new DateTime().Add(storedTime).ToString("hh:mm tt"); 我是否可以将其重新存储在另一个String类型的变量中,如下所示 String displayValue
System.TimeSpan
类型的变量中存储了一个值,如下所示
System.TimeSpan storedTime = 03:00:00;
TimeSpan storedTime = new TimeSpan(03,00,00);
string displayValue = new DateTime().Add(storedTime).ToString("hh:mm tt");
我是否可以将其重新存储在另一个String
类型的变量中,如下所示
String displayValue = "03:00 AM";
如果storedTime
变量的值为
storedTime = 16:00:00;
然后应将其转换为:
String displayValue = "04:00 PM";
您可以将
TimeSpan
添加到DateTime
,例如:
TimeSpan span = TimeSpan.FromHours(16);
DateTime time = DateTime.Today + span;
String result = time.ToString("hh:mm tt");
演示:
这是一个时间点,不是持续时间(TimeSpan)
所以你的基本设计或假设有问题
如果您确实想使用它,您必须首先将其转换为日期时间(时间点)。您可以格式化不带日期部分的日期时间,这将是您所需的字符串
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点钟,但表示形式是二进制的,时间跨度不能记录16:00
和4 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"
将timespan解析为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"
首先,您需要将时间跨度转换为日期时间结构:
var dt = new DateTime(2000, 12, 1, timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds)
然后需要将值转换为格式为的字符串
您需要从TimeSpan
中获取DateTime
对象,然后可以轻松地对其进行格式化
一种可能的解决方案是将timespan添加到任何时间值为零的日期
var timespan = new TimeSpan(3, 0, 0);
var output = new DateTime().Add(timespan).ToString("hh:mm tt");
输出值将为“03:00am”
(适用于英语地区)。在此处对现有答案进行一些补充:
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();
}
使用字符串格式非常简单
在.ToSTring(“”:
- 如果使用“hh”->>小时,则使用12小时的时钟从01到12
- 如果使用“HH”->>小时,则使用从00到23的24小时时钟
- 如果您添加“tt”->>Am/Pm指示符
从晚上23:12转换到11: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();
等等,这里有一个陷阱,系统文化!!,在windows上执行的相同代码设置为不同的语言
特别是不同的文化,语言会产生不同的结果
例如,在设置为阿拉伯语的windows中,结果如下:
DateTime d = new DateTime(1, 1, 1, 23, 12, 0);
var res = d.ToString("HH:mm tt", CultureInfo.InvariantCulture); // this show 11:12 Pm
//23:12م
م表示晚上(مساء的第一个字母)
在设置为德语的windows中,我认为它将显示//23:12 du
您可以在windows控制面板的“windows区域和语言”->“当前格式”(组合框)下的不同格式之间进行更改,并更改。。。应用它,重建(执行)你的应用程序,看看我在说什么
那么,如果当前系统的区域性未设置为英语,您如何强制在英语活动中显示Am和Pm前缀
只需添加两行即可轻松->
第一步使用系统全球化添加代码>在您的代码之上
并将前面的代码修改为:
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使用阿拉伯语或特定语言,即使我使用的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”。每种语言都有一个列表
例如:
阿拉伯文
阿拉伯文(巴林)
阿拉伯文(阿尔及利亚)
阿拉伯语(埃及)
…您可以尝试以下方法:
string timeexample= string.Format("{0:hh:mm:ss tt}", DateTime.Now);
您可以根据需要移除hh或mm或ss或tt
哪里
hh是12小时格式的小时,
mm是分钟,ss是秒,tt是AM/PM。您不能将AM/PM添加到时间跨度中。如果要以12小时时钟格式显示时间,则必须将TimaSpan
值与DateTime
相关联
TimeSpan
不适用于12小时时钟格式,因为我们在这里讨论的是时间间隔
正如书中所说
TimeSpan
对象表示时间间隔(持续时间或经过的时间),该时间间隔以天数、小时数、分钟数、秒数和一秒分数的正数或负数来度量。TimeSpan
结构也可用于表示一天中的时间,但前提是时间与特定日期无关。否则,应使用DateTime
或DateTimeOffset
结构
还描述如下
TimeSpan
值可以表示为[-]d.hh:mm:ss.ff
,其中可选的减号表示负时间间隔,d
分量为天,hh
是在24小时时钟上测量的小时,mm
是分钟,ss
是秒,而ff
是一秒的分数
因此,在这种情况下,可以使用AM/PM显示,如下所示
System.TimeSpan storedTime = 03:00:00;
TimeSpan storedTime = new TimeSpan(03,00,00);
string displayValue = new DateTime().Add(storedTime).ToString("hh:mm tt");
旁注:
还应注意,DateTime
的属性是一个TimeSpan
,其中它表示
一个时间间隔,表示从午夜起一天中经过的部分时间
因为这种情况既常见又烦人。。。我创建了一个helper类,我已经在一个NuGet包中发布了它。这可能是一种私有方法,可以在MVC视图以及后端C#代码中使用
不幸的是,DateTime.TimeOfDay
返回了一个TimeSpan
-Microsoft引导您使用这种设计:(@JonSkeet我不知道这是最糟糕的设计(鉴于您在野田佳彦的工作,我知道您是这方面的专家),这是理解解释的局限性的问题。没有相对DateTime的概念
TimeSpan storedTime = new TimeSpan(03,00,00);
string displayValue = new DateTime().Add(storedTime).ToString("hh:mm tt");
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;
}