44

我有一个时间是 16:23:01。我尝试使用DateTime.ParseExact,但它不起作用。

这是我的代码:

string Time = "16:23:01"; 
DateTime date = DateTime.ParseExact(Time, "hh:mm:ss tt", System.Globalization.CultureInfo.CurrentCulture);

lblClock.Text = date.ToString();

我希望它在标签中显示为下午 04:23:01。

4

4 回答 4

87

“16:23:01”与“hh:mm:ss tt”的模式不匹配——它没有 am/pm 指示符,而且 16 显然不在 12 小时制中。您在解析部分指定该格式,因此您需要匹配现有数据的格式。你要:

DateTime dateTime = DateTime.ParseExact(time, "HH:mm:ss",
                                        CultureInfo.InvariantCulture);

(注意不变的文化,而不是当前的文化——假设你的输入真的总是使用冒号。)

如果要将其格式化hh:mm:ss tt,则需要将该部分放入ToString调用中:

lblClock.Text = date.ToString("hh:mm:ss tt", CultureInfo.CurrentCulture);

或者更好的是(IMO)使用“无论文化的长期模式是什么”:

lblClock.Text = date.ToString("T", CultureInfo.CurrentCulture);

另请注意,这hh是不寻常的;通常你不想为小于 10 的数字填充 0-left-pad 数字。

(还可以考虑使用我的Noda Time API,它有一个LocalTime类型——更适合“一天中的时间”。)

于 2013-09-20T14:42:36.437 回答
12
string Time = "16:23:01";
DateTime date = DateTime.Parse(Time, System.Globalization.CultureInfo.CurrentCulture);

string t = date.ToString("HH:mm:ss tt");
于 2013-09-20T14:47:41.400 回答
5

这将为您提供所需的结果:

string time = "16:23:01";
var result = Convert.ToDateTime(time);
string test = result.ToString("hh:mm:ss tt", CultureInfo.CurrentCulture);
//This gives you "04:23:01 PM"  string

您也可以使用CultureInfo.CreateSpecificCulture("en-US"),因为并非所有文化都会显示 AM/PM。

于 2013-09-20T14:49:24.053 回答
0

公认的解决方案不包括边缘情况。我找到了使用 4KB 脚本执行此操作的方法。处理您的输入并转换数据。

例子:

00:00:00 -> 00:00:00
12:01 -> 12:01:00
12 -> 12:00:00
25 -> 00:00:00
12:60:60 -> 12:00:00
1dg46 -> 14:06

你明白了......检查它https://github.com/alekspetrov/time-input-js

于 2020-04-02T20:10:17.820 回答