我正在开发一个Console
应用程序,用于将时间从 12小时格式转换为 24小时格式:
输入:02:03:34 PM预期输出:14:03:34
但我得到 14:3:34 以下是我的代码段:
string[] arr_temp = Console.ReadLine().Split(':');
string time = arr_temp[2].ToUpper().Contains("AM") ? "AM" : "PM";
string sec=string.Empty;
for (int i = 0; i < 2; i++)
{
sec+= arr_temp[2][i];
}
int _hour = Int32.Parse(arr_temp[0])==0?0: Int32.Parse(arr_temp[0]);
int _minute = Int32.Parse(arr_temp[1]) == 0 ? 0 : Int32.Parse(arr_temp[1]);
int _sec = Int32.Parse(sec)==0?0: Int32.Parse(sec);
_hour = (time == "PM") ? _hour += 12 : _hour += 0;
_hour = (_hour < 10) ? '0' + _hour : _hour;
_minute = (_minute < 10) ? '0' + _minute : _minute;
_sec = (_sec < 10) ? '0' + _sec : _sec;
我没有得到预期的输出。 请建议。
答案 0 :(得分:3)
对我来说似乎有点复杂,因为有一种更简单的方法可以将 DateTime 变量显示为12或24小时格式。
首先,您必须将字符串转换为有效的DateTime对象。您可以使用解析方法,但首先要验证用户返回的输入字符串作为有效日期。
使用以下代码将字符串转换为DateTime:
string dateString = "03/01/2009 10:00 AM";
DateTime date = DateTime.Parse(dateString);
如果输入字符串格式不正确,DateTime.Parse 将抛出异常。为了确保不会发生这种情况,请改用 DateTime.TryParse 。
string dateString = "03/01/2009 10:00 AM";
DateTime dateTime;
if (DateTime.TryParse(dateString , out dateTime))
{
Console.WriteLine(dateTime);
}
然后,您可以显示DateTime变量并按照您希望的方式对其进行格式化。
DateTime dateTime = DateTime.Now;
string str12Format = dateTime.ToString("hh:mm:ss tt"); //12 hours format
string str24Format = dateTime.ToString("HH:mm:ss tt"); //24 hours format
答案 1 :(得分:2)
尝试使用DateTime.TryParseExact后跟ToString
,不要重复Microsoft 并重新发明轮子:
string source = Console.ReadLine();
DateTime date;
// DateTime.TryParseExact supports many formats; that's why "12:34AM" will be accepted
// DateTimeStyles.AllowWhiteSpaces let us be nice and allow, say "11 : 34 : 47 PM"
if (DateTime.TryParseExact(
source,
new string[] {"h:m:stt" , "h:mtt", "htt", "H:m:s", "H:m", "H"},
CultureInfo.InvariantCulture, // or CultureInfo.CurrentCulture
DateTimeStyles.AssumeLocal | DateTimeStyles.AllowWhiteSpaces,
out date))
Console.WriteLine(date.ToString("HH:mm:ss"));
else
Console.WriteLine($"Sorry, {source} is not a valid date");
答案 2 :(得分:1)
_hour
是一个整数。您不能将字符串连接到整数。但反过来是可能的。
所以你应该使用它:
int _hour = Int32.Parse(arr_temp[0])==0?0: Int32.Parse(arr_temp[0]);
int _minute = Int32.Parse(arr_temp[1]) == 0 ? 0 : Int32.Parse(arr_temp[1]);
int _sec = Int32.Parse(sec)==0?0: Int32.Parse(sec);
_hour = (time == "PM") ? _hour += 12 : _hour += 0;
String _hourS = (_hour < 10) ? '0' + _hour : _hour;
String _minuteS = (_minute < 10) ? '0' + _minute : _minute;
答案 3 :(得分:0)
输入您的输入
public static TimeSpan ConvertToAMPM(DateTime date)
{
return TimeSpan.Parse(date.ToString("h:mm tt",
CultureInfo.InvariantCulture));
}
public static TimeSpan ConvertTo24Hour(string time)
{
var cultureSource = new CultureInfo("en-US", false);
var cultureDest = new CultureInfo("de-DE", false);
var dt = DateTime.Parse(time, cultureSource);
return TimeSpan.Parse(dt.ToString("t", cultureDest));
}
答案 4 :(得分:0)
到目前为止,其他答案主要涉及处理DateTime
的示例,但它们并未解释您的代码中断的原因。
您要做的是向int
变量添加前导零,就像您使用字符串一样。
问题是int
的内部表示只是数字本身,并且它不包含格式信息。因此,它无法存储有关前导零的信息。这只能通过使用string
来完成,int
不代表数字而是代表字符集。
因此,本质上是您需要将数据及其表示视为两个独立的事物。一般来说,最好将数据保留为原生形式,并且只在需要显示时才转换它。这也允许您尊重显示表示的文化差异。
许多基本数据类型(包括DateTime
和int
等)都是可格式化的。这意味着它们可以转换为关于描述该表示应该如何的模式的字符串(显示)表示。对于string _hourDisplay = _hour.ToString("00");
,这样的模式可以定义它需要具有前导零,如下所示:
scrolling="yes"
答案 5 :(得分:0)
您好,Nishank,请使用此代码:
string[] arr_temp = Console.ReadLine().Split(':');
string time = arr_temp[2].ToUpper().Contains("AM") ? "AM" : "PM";
string sec = arr_temp[2].Substring(0, 2);
string _hour = "";
if (time == "PM" && Int32.Parse(arr_temp[0]) < 12)
_hour = (Int32.Parse(arr_temp[0]) + 12).ToString("D2");
else if (time == "AM" && Int32.Parse(arr_temp[0]) == 12)
_hour = "00";
else
_hour = Int32.Parse(arr_temp[0]).ToString("D2");
string _minute = Int32.Parse(arr_temp[1]) == 0 ? "00" : Int32.Parse(arr_temp[1]).ToString("D2");
string _sec = Int32.Parse(sec) == 0 ? "00" : Int32.Parse(sec).ToString("D2");
string outputTime = _hour + ":" + _minute + ":" + _sec + "" + time;