将时间跨度值转换为“格式”;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;
        }