【问题标题】:how to convert 24-hour format TimeSpan to 12-hour format TimeSpan?如何将 24 小时格式的 TimeSpan 转换为 12 小时格式的 TimeSpan?
【发布时间】:2012-04-12 12:18:18
【问题描述】:

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

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

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

【问题讨论】:

  • 你能提供你的代码吗..来理解你的问题..
  • 不太清楚,能否详细说明。时间跨度不是绝对时间,因此您不能用 AM/PM 表示它。所以 14:00:00 似乎不是 Timespan 只是时间以这种格式存储在字符串变量中吗?
  • 这个link 会有所帮助
  • 对我来说这个问题很清楚。在TimeSpan 14:00:00 上执行ToString 时,将返回字符串14:00:00。问题是返回2:00:00 PM 需要什么? (并且已经提供了对这个问题的解释的答案。)
  • @MartinLiversage,返回值也是一个TimeSpan对象,下午2:00,谢谢

标签: c#


【解决方案1】:

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

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

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

然而,尽管TimeSpan 表示一个时间间隔,但它非常适合表示一天中的时间(DateTime.TimeOfDay 返回一个TimeSpan)。因此,将其用于此目的并非不合理。

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

  • 使用DateTime:

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

    ToString 中使用的格式说明符记录在 MSDN 上的 Custom Date and Time Format Strings 页面上。指定使用所需 AM/PM 指示符的CultureInfo 很重要。否则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);
    

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

【讨论】:

  • 哇...这么详细的答案,2个解决方案,还有MSDN上的自定义格式教程...非常感谢!
  • 这个解决方案对我的帮助最大。我的 formattedTime 变量如下所示:var formattedTime = String.Format("{0}{1}", hours, amPmDesignator);
【解决方案2】:

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

【讨论】:

  • 其实TimeSpan 非常适合表示一天中的某个时间,只要您确定TotalDays < 1。运算符重载允许您轻松计算诸如 DateTime 之类的特定日期的事件和代表一天中某个时间的给定 TimeSpan。同样DateTime.TimeOfDay 将返回TimeSpan
  • 很多优点,但需要稍微改变一下时间的表示方式。令人困惑的是,DateTime 返回以表示一天中的某个时间的类型可能具有实际上跨越 多天 的值(尽管从逻辑上讲永远不会)。
【解决方案3】:

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

var t = DateTime.Now.TimeOfDay;

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

ToShortTimeString() 也可以使用,但它取决于区域设置,因此它不会在非美国系统上正确显示(或正确显示,取决于您的查看方式)。

【讨论】:

  • 您需要在 ToString 调用中指定 CultureInfo 之类的 CultureInfo.InvariantCulture 以避免当前区域性使用 24 小时时间格式时出现问题(在这种情况下,格式说明符 tt 插入一个空字符串)。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    试试这个代码:

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

    【讨论】:

      【解决方案6】:

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

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

      产量:

      下午 2:00

      【讨论】:

        【解决方案7】:
        String formatted = yourDateTimeValue.ToString("hh:mm:ss tt");
        

        【讨论】:

          【解决方案8】:

          很简单, 假设我们有一个 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

          【讨论】:

            猜你喜欢
            • 2011-03-31
            • 2019-12-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多