92

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

System.TimeSpan storedTime = 03:00:00;

我可以将它重新存储在另一个类型String的变量中吗?

String displayValue = "03:00 AM";

如果storedTime变量的值为

storedTime = 16:00:00;

那么它应该转换为:

String displayValue = "04:00 PM";
4

13 回答 13

207

您可以通过将时间跨度添加到日期来做到这一点。

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"
于 2012-10-24T07:32:11.930 回答
15

使用字符串格式非常简单

.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 阿拉伯语(埃及).....

于 2015-07-23T00:42:52.313 回答
12

您可以添加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

标准日期和时间格式字符串

于 2012-10-24T07:30:35.690 回答
12

在这里做一些捎带现有的答案:

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();
}
于 2014-08-15T15:21:05.407 回答
11
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

于 2012-10-24T07:30:50.993 回答
9

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

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

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

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

于 2012-10-24T07:33:54.177 回答
6

您不能将AM/PM添加到TimeSpan. 如果您想以 12 小时制格式显示时间,则无论如何都必须将TimaSpan值与相关联。DateTime

TimeSpan不打算与 12 小时时钟格式一起使用,因为我们在这里讨论的是时间间隔

正如它在文档中所说的那样;

一个TimeSpan对象表示一个时间间隔(持续时间或经过的时间),它被测量为天数、小时数、分钟数、秒数和秒数的正数或负数。TimeSpan结构还可用于表示一天中的时间,但前提是时间与特定日期无关。否则,应使用DateTimeor结构。DateTimeOffset

Microsoft Docs也描述如下;

TimeSpan可以表示为[-]d.hh:mm:ss.ff,其中可选的减号表示负时间间隔,d分量是天,是在24 小时制hh上测量的小时,是分钟,是秒,是秒的几分之一。mmssff

因此,在这种情况下,您可以使用 AM/PM 进行如下显示。

TimeSpan storedTime = new TimeSpan(03,00,00);
string displayValue = new DateTime().Add(storedTime).ToString("hh:mm tt");


旁注
还应注意TimeOfDay的属性DateTime是 a TimeSpan,它代表

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

于 2017-10-19T04:29:50.973 回答
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"
于 2012-10-24T07:32:49.560 回答
2

为避免时间跨度格式限制,请转换为日期时间。最简单的表达方式是:

// Where value is a TimeSpan...
(new DateTime() + value).ToString("hh:mm tt");
于 2021-07-12T11:37:06.017 回答
2

你可以试试这个:

   string timeexample= string.Format("{0:hh:mm:ss tt}", DateTime.Now);

您可以根据需要删除 hh 或 mm 或 ss 或 tt,其中 hh 是 12 小时甲酸盐中的小时,mm 是分钟,ss 是秒,tt 是 AM/PM。

于 2016-08-06T12:43:32.407 回答
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;
                }
于 2015-07-15T09:30:01.150 回答
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
于 2012-10-24T07:33:35.237 回答
0

因为这种情况很烦人,因为它很常见......我创建了一个助手类,我已经在 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;
        }

在此处输入图像描述

于 2021-05-28T13:43:42.073 回答