使用C#将时间跨度值转换为格式“ hh:mm Am / Pm”


80

我有一个存储在类型变量中的值System.TimeSpan,如下所示。

System.TimeSpan storedTime = 03:00:00;

我可以String按如下方式将其重新存储在另一个类型的变量中吗?

String displayValue = "03:00 AM";

如果storedTime变量的值为

storedTime = 16:00:00;

然后应将其转换为:

String displayValue = "04:00 PM";

Answers:


189

您可以通过将时间跨度添加到日期中来实现。

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
shaijut 2015年

1
请注意,这将始终12小时制时钟提供AM / PM前缀。如果您希望结果遵循给定的文化,则可以ShortTimePattern改用:string displayTime = time.ToString("t" [, culture]);
Sphinxxx

1
或者您也可以致电time.ToShortTimeString()
Mardok

time.ToShortTimeString()在03:00 PM不会保持前面的0。time.ToString(“ hh:mm tt”)负责处理
Souvik Basu

我想要没有任何日期的TimeSpan,也许没关系,但是您绑定今天的日期,这是不正确的,使用像string.Format(@“ {0:hh \:mm \:ss}”,timespan)更好,但我不知道不知道如何添加AM / PM :(
QMaster

14

使用字符串格式非常简单

.ToSTring("") :

  • 如果使用“ hh”->>小时,则使用从12到01的12小时制时钟。

  • 如果您使用“ HH”->>小时,则使用24小时制,从00到23。

  • 如果添加“ 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();

稍等片刻,这不是您需要关心的所有事情,而是系统文化,因为在Windows上与其他语言一起执行的相同代码,尤其是具有不同文化语言的代码将生成具有相同代码的不同结果

设置为阿拉伯语言文化的窗户的示例将显示为:

// 23:12م

م表示“晚上”(مساfirst的第一个字母)。

在另一种系统文化中,取决于Windows区域和语言选项的设置,它将显示// 23:12 du。

您可以在Windows区域和语言下的Windows控制面板上的不同格式之间进行切换->当前格式(组合框),然后更改...应用它来重新构建(执行)您的应用并观看iam所讨论的内容。

如果当前系统的文化未设置为英语,那么谁可以强制在英语事件中显示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م

如果我的系统设置为英语区域格式,则为event。您可以将“ ar-AE”更改为其他语言格式。每种语言及其格式都有一个列表。

示例:ar ar-SA阿拉伯语ar-BH ar-BH阿拉伯语(巴林)ar-DZ ar-DZ阿拉伯语(阿尔及利亚)ar-EG ar-EG阿拉伯语(埃及)


5
该问题询问有关TimeSpan的问题。该答案适用于DateTime。
thelem


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点的值,但表示是二进制的,时间跨度不能记录之间的差别16:004 pm


11
不幸的是,它DateTime.TimeOfDay返回了TimeSpan-微软引导您进行这种设计:(
Jon Skeet 2012年

2
@JonSkeet我不知道这是最糟糕的设计(而且,考虑到您在Noda上的工作,我知道您对此事不屑一顾),这是了解解释的局限性。没有亲戚的概念DateTime,如果有的话,那么(“ 03:00 AM”)将仅仅是一个实例。但是,我可以看到,对于大多数用例而言,这种设计(相对DateTime)会使问题变得过于复杂(当然,这样做的代价是使围绕日期,时间,绝对值或非绝对值进行非常具体的工作变得更加复杂) ,时区等)
casperOne,2012年

7
@casperOne:从根本上说,它使用一种类型来表示逻辑上将存储在另一种类型中的信息,只是因为如果您斜视一下,它们看起来就很相似。我不会建议超载的意思DateTime,甚至(它已经够糟了)。应该有一个代表“一天中的时间”的类型-当然,这正是我在Noda Time中实现的。每当您尝试将许多不同的概念填充到少数类型中时,您肯定会遇到这样的问题。
乔恩·斯凯特

1
这个答案很好,因为它解释了为什么TimeSpan会按其行为方式进行操作,而不仅仅是说明如何解决问题。真的应该有三种类型:DateTimeTimeOfDayDate
塞勒姆

03:00 AM不是“时间点”。这是“一天中的要点”。
亚历克斯(Alex)

10

在这里进行一些现有答案的piggy带:

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'1

8

您将需要DateTime从您的对象中获取一个对象TimeSpan,然后可以轻松设置其格式。

一种可能的解决方案是将时间跨度添加到时间值为零的任何日期。

var timespan = new TimeSpan(3, 0, 0);
var output = new DateTime().Add(timespan).ToString("hh:mm tt");

输出值为"03:00 AM"(对于英语语言环境)。


5

您无法将AM / PM添加到TimeSpan。如果要以12小时时钟格式显示时间TimaSpanDateTime则无论如何都必须将值与之关联。

TimeSpan不适用于12小时制,因为我们在这里讨论的是时间间隔

正如它在文档中所说;

TimeSpan对象表示一个时间间隔,其作为测量(时间或经过的时间的持续时间)的正或负天,小时,分钟,秒和秒的小数部分的数。该TimeSpan结构也可以用于表示一天中的时间,但前提是该时间与特定日期无关。否则,应改用DateTimeorDateTimeOffset结构。

此外微软文档描述如下:

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");


旁注
还应注意,的TimeOfDay属性DateTimeTimeSpan,它表示

一个时间间隔,表示自午夜以来经过的一天的一部分。


3

将时间跨度解析为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"

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.