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

Ami*_*mar 70 .net c#

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

System.TimeSpan storedTime = 03:00:00;
Run Code Online (Sandbox Code Playgroud)

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

String displayValue = "03:00 AM";
Run Code Online (Sandbox Code Playgroud)

如果storedTime变量的值为

storedTime = 16:00:00;
Run Code Online (Sandbox Code Playgroud)

那么它应该转换为:

String displayValue = "04:00 PM";
Run Code Online (Sandbox Code Playgroud)

Asi*_*taq 165

您可以通过将时间跨度添加到日期来完成此操作.

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"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这将*始终*给出带有 AM/PM 前缀的 [12 小时时钟](https://en.wikipedia.org/wiki/12-hour_clock) 时间。如果您希望结果遵循给定的区域性,可以使用 `ShortTimePattern` 代替: `string displayTime = time.ToString("t" [,culture]);` (2认同)
  • 或者你可以调用`time.ToShortTimeString()` (2认同)

Bil*_*lal 13

使用字符串格式非常简单

.ToSTring("") :

  • 如果你使用"hh" - >>小时,使用从12到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();
Run Code Online (Sandbox Code Playgroud)

等待一秒不是你需要关心的其他东西就是系统文化,因为在窗口上执行相同的代码与其他语言特别是不同的文化语言将使用相同的代码产生不同的结果

设置为阿拉伯语文化的窗口的例子将显示如下:

// 23:12م

م表示晚上(مساء的第一个).

在另一个系统文化取决于windows区域和语言选项上设置的内容,它将显示// 23:12 du.

你可以在windows区域和语言 - >当前格式(组合框)下更改窗口控制面板上的不同格式,并更改...应用它做你的应用程序的重建(执行),看看我在说什么.

那么如果当前系统的文化没有设置为英语,我可以强制在英语中显示Am和Pm Words吗?

只需添加两行即可: - >

第一步添加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
Run Code Online (Sandbox Code Playgroud)

InvariantCulture =>使用默认的英文格式.

另一个问题我想让pm用阿拉伯语或特定语言,即使我使用Windows设置为英语(或其他语言)区域格式?

阿拉伯语的例子:

DateTime d = new DateTime(1, 1, 1, 23, 12, 0);
var res = d.ToString("HH:mm tt", CultureInfo.CreateSpecificCulture("ar-AE")); 
Run Code Online (Sandbox Code Playgroud)

这将显示// 23:12م

如果我的系统设置为英语区域格式,则为event.如果你想要另一种语言格式,你可以改变"ar-AE".每种语言及其格式都有一个列表.

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

  • 关于TimeSpan的问题.这个答案是针对DateTime的. (4认同)

Tim*_*ter 11

您可以添加TimeSpan到a DateTime,例如:

TimeSpan span = TimeSpan.FromHours(16);
DateTime time = DateTime.Today + span;
String result = time.ToString("hh:mm tt");
Run Code Online (Sandbox Code Playgroud)

演示:http://ideone.com/veJ6tT

04:00 PM
Run Code Online (Sandbox Code Playgroud)

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


Hen*_*man 10

string displayValue="03:00 AM";
Run Code Online (Sandbox Code Playgroud)

这是一个时间点,而不是持续时间(TimeSpan).

所以你的基本设计或假设出了问题.

如果您确实想要使用它,则必须先将其转换为DateTime(时间点).您可以格式化没有日期部分的DateTime,这将是您想要的字符串.

TimeSpan t1 = ...;
DateTime d1 = DateTime.Today + t1;               // any date will do
string result = d1.ToString("hh:mm:ss tt");
Run Code Online (Sandbox Code Playgroud)

storeTime变量可以具有类似值
storeTime=16:00:00;

不,它可以有4点的值,但表示是二进制的,时间跨度不能记录之间的差别16:004 pm.

  • 不幸的是`DateTime.TimeOfDay`返回一个`TimeSpan` - 微软引导你进入这个设计:( (11认同)
  • @casperOne:从根本上说,它使用一种类型来表示逻辑上存储在不同类型中的信息,只是因为如果你足够眯眼,它们看起来很相似.我不建议超载'DateTime`的含义甚至*进一步*(它已经足够糟糕了).应该有一种代表"时间"的类型 - 当然,这正是我在Noda Time中实现的.每当你尝试将许多不同的概念填充到少数类型中时,你一定会遇到这样的问题. (7认同)
  • @JonSkeet我不知道这是最糟糕的设计(而且,考虑到您在Noda上的工作,我知道您对此事不屑一顾),这是理解解释局限性的问题。没有相对的“ DateTime”的概念,如果有的话,那么(“ 03:00 AM”)将仅仅是一个实例。但是,我可以看到,对于大多数用例而言,这种设计(相对的“ DateTime”)会使问题变得过于复杂(当然,这样做的代价是使其在日期,时间,绝对与否,时区等) (2认同)

Chr*_*sic 10

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

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 这是最诚实的答案 (3认同)

Mic*_*uda 6

您需要DateTime从您那里获取一个对象TimeSpan,然后您可以轻松地对其进行格式化.

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

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

输出值将为"03:00 AM"(对于英语区域设置).


Cur*_*ity 5

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

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

文档中所说;

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

此外微软文档描述如下:

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");
Run Code Online (Sandbox Code Playgroud)


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

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


Tho*_*euf 5

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

// Where value is a TimeSpan...
(new DateTime() + value).ToString("hh:mm tt");
Run Code Online (Sandbox Code Playgroud)