15

我有 TimeSpan 数据表示为 24 小时格式,例如 14:00:00,我想将其转换为 12 小时格式,下午 2:00,我用谷歌搜索并在 stackoverflow 和 msdn 中找到了相关的内容,但没有解决这个问题,谁能帮帮我?提前致谢。

更新 似乎可以将 24 小时格式的 TimeSpan 转换为字符串,但无法将字符串转换为 12 小时格式的 TimeSpan :(

但是我仍然得到了很多好的答案,谢谢!

4

8 回答 8

29

(在一个答案中总结我分散的评论。)

首先,您需要了解它TimeSpan代表一个时间间隔。此时间间隔在内部表示为滴答计数,不是字符串14:00:00也不是字符串2:00 PM。只有当您将 转换TimeSpan为字符串时,谈论两种不同的字符串表示形式才有意义。从一种表示切换到另一种表示不会改变或转换存储在TimeSpan.

写时间2:00 PM而不是14:00:00关于日期/时间格式和文化。这一切都由DateTime班级处理。

但是,即使TimeSpan表示时间间隔,它也非常适合表示一天中的时间(DateTime.TimeOfDay返回 a TimeSpan)。因此,将其用于此目的并非不合理。

要执行所描述的格式化,您需要依赖格式化逻辑DateTime或简单地创建自己的格式化代码。

  • 使用DateTime

    var dateTime = new DateTime(timeSpan.Ticks); // Date part is 01-01-0001
    var formattedTime = dateTime.ToString("h:mm tt", CultureInfo.InvariantCulture);
    

    使用 in 的格式说明符ToString记录在 MSDN 上的自定义日期和时间格式字符串页面上。CultureInfo指定使用所需 AM/PM 指示符的a 很重要。否则,tt格式说明符可能会被空字符串替换。

  • 使用自定义格式:

    var hours = timeSpan.Hours;
    var minutes = timeSpan.Minutes;
    var amPmDesignator = "AM";
    if (hours == 0)
      hours = 12;
    else if (hours == 12)
      amPmDesignator = "PM";
    else if (hours > 12) {
      hours -= 12;
      amPmDesignator = "PM";
    }
    var formattedTime =
      String.Format("{0}:{1:00} {2}", hours, minutes, amPmDesignator);
    

    诚然,这种解决方案比第一种方法复杂得多。

于 2012-04-12T14:46:01.513 回答
9

TimeSpan表示时间间隔而不是一天中的时间。该DateTime结构更有可能是您正在寻找的。

于 2012-04-12T12:21:57.393 回答
8

您需要先将 TimeSpan 转换为 DateTime 对象,然后使用您需要的任何DateTime 格式

var t = DateTime.Now.TimeOfDay;

Console.WriteLine(new DateTime(t.Ticks).ToString("hh:mm:ss tt"));

ToShortTimeString()也可以,但它取决于区域设置,因此它不会在非美国系统上正确显示(或正确显示,取决于你如何看待它)。

于 2012-04-12T12:25:49.633 回答
6

TimeSpan表示时间间隔(时间之间的差异),而不是日期或时间,因此以 24 小时或 12 小时格式定义它几乎没有意义。我假设您实际上想要一个DateTime.

例如今天下午 2 点:

TimeSpan ts = TimeSpan.FromHours(14);
DateTime dt = DateTime.Today.Add(ts);

然后,您可以根据需要格式化该日期:

String formatted = String.Format("{0:d/M/yyyy hh:mm:ss}", dt); // "12.4.1012 02:00:00" - german (de-DE)

http://msdn.microsoft.com/en-us/library/az4se3k1%28v=vs.100%29.aspx

于 2012-04-12T12:25:20.523 回答
4

试试这个代码:

int timezone = 0;

此字符串给出 12 小时格式

string time = DateTime.Now.AddHours(-timezone).ToString("hh:mm:ss tt");

此字符串提供 24 小时格式

string time = DateTime.Now.AddHours(-timezone).ToString("HH:mm:ss tt");
于 2012-04-12T12:57:43.730 回答
1

TimeSpan假设您停留在 24 小时范围内,您可以通过从今天DateTime(或任何日期)中减去负数来实现您想要的结果,然后去掉日期部分:

DateTime dt = DateTime.Today;
dt.Subtract(-TimeSpan.FromHours(14)).ToShortTimeString();

产量:

下午 2:00

于 2012-04-12T12:22:32.683 回答
1
String formatted = yourDateTimeValue.ToString("hh:mm:ss tt");
于 2012-04-12T12:29:25.653 回答
1

这很简单,假设我们有一个 TimesSpan 的对象tsTimeSpan ts = new TimeSpan(); 并假设它包含一些值,例如 14:00:00 现在首先将其转换为字符串,然后在 DateTime 中如下所示:

TimeSpan ts = new TimeSpan(); // this is object of TimeSpan and Suppose it contains
                              // value 14:00:00
string tIme = ts.ToString(); // here we convert ts into String and Store in Temprary
                             // String variable.
 DateTime TheTime = new DateTime(); // Creating the object of DateTime;
 TheTime = Convert.ToDateTime(tIme); // now converting our temporary string into DateTime;
 Console.WriteLine(TheTime.ToString(hh:mm:ss tt));

这将显示结果为: 02:00: 00 PM

于 2019-05-13T17:21:11.390 回答