1

我在将剑道时间选择器的值保存为 24 小时格式时遇到问题,时间选择器显示"HH:mm tt"格式但我想将其转换为"HH:mm:ss",我使用时间跨度作为我的下拉列表

示例代码

String clientShiftId = formCollection["clientShiftId"];
            String clientId = formCollection["clientId"];
            String dateShift = formCollection["dllShiftDay"];
            String startTime = formCollection["txtStartTime"];
            String endTime = formCollection["txtEndTime"];
            var stayHere = formCollection["stayHere"];

            Client_Customer_Position_Shift clientCusPosShift = new Client_Customer_Position_Shift();
            try
            {

                if (String.IsNullOrWhiteSpace(clientShiftId) || clientShiftId == "0")
                {
                    client.Client_Customer_PositionID = Convert.ToInt32(clientId);
                    clientCusPosShift.Day_LookID = Convert.ToInt32(dateShift);
                    DateTime parsed = DateTime.ParseExact(endTime.Trim(), "hh:mm tt",CultureInfo.InvariantCulture);
                    client.EndTime = parsed.ToString("HH:mm:ss", CultureInfo.InvariantCulture);  <------- Line of Error 
DateTime parse = DateTime.ParseExact(startTime.Trim(), "hh:mm tt",CultureInfo.InvariantCulture);
                    client.StartTime = parse.ToString("HH:mm:ss", CultureInfo.InvariantCulture);  <------- Line of Error 
4

1 回答 1

3

您无法将其解析为TimeSpan是否具有 AM/PM 指示符。你可以使用:

DateTime parsed = DateTime.ParseExact(endTime.Trim(), "hh:mm tt",
                                      CultureInfo.InvariantCulture);

// If you need a string
client.EndTime = parsed.ToString("HH:mm:ss", CultureInfo.InvariantCulture);

// If you just need a TimeSpan
client.EndTime = parsed.TimeOfDay;

我假设您获得的价值将始终存在于不变的文化中?您还应该考虑使用DateTime.TryParseExact而不是ParseExact,以便更清楚地检测无效输入。

顺便说一句,在解析时请注意“hh”而不是“HH” - 您将收到 11pm 作为“11:00 pm”而不是“23:00 pm”。另请注意我如何使用局部变量作为中间值 - 我建议不要重复设置相同的属性 ( client.EndTime),这可能会在调试时导致混淆。

(顺便说一句,您也可以为此使用我的Noda Time库,它有一个单独的LocalTime类型,在这里更合适,因为您没有日期。我不建议仅在这种情况下使用它,但是如果您'正在应用程序中进行其他日期/时间工作,您可能会发现它很有用。)

于 2013-08-23T06:18:05.340 回答