C# DateTime这种奇怪行为的原因是什么?
我有这个方法:C# DateTime这种奇怪行为的原因是什么?,c#,datetime,C#,Datetime,我有这个方法: public static DateTime GetDatetime(string ampm, string hour, string minute) { int iHour = Convert.ToInt32(hour); int iMinute = Convert.ToInt32(minute); if (ampm == "PM" && iHour != 12)
public static DateTime GetDatetime(string ampm, string hour, string minute)
{
int iHour = Convert.ToInt32(hour);
int iMinute = Convert.ToInt32(minute);
if (ampm == "PM" && iHour != 12)
iHour = 12 + iHour;
DateTime dtTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
DateTime.Now.Day, iHour, iMinute, 0);
return dtTime;
}
它基本上接受AM/PM、小时和分钟,并给出日期时间。我提供输入作为
DateTime startTIme = GetDatetime("AM", "12", "30");
我在本地机器上准确地得到了早上12:30的时间。然而,当我在服务器上运行相同的方法时,我得到的时间是下午12:30。这让我快发疯了。有人能帮我吗?我做错了什么
更新:
我的新职能是:
public static DateTime GetDatetime(string ampm, string hour, string minute)
{
int iHour = Convert.ToInt32(hour);
int iMinute = Convert.ToInt32(minute);
if (ampm == "PM" && iHour != 12)
iHour = 12 + iHour;
else if (ampm == "AM" && iHour == 12)
iHour = 0;
DateTime dtTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
DateTime.Now.Day, iHour, iMinute, 0);
return dtTime;
}
这似乎很管用。有人能在这段代码中找到任何问题吗?请像这样检查当前的区域性:
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-us");
因为在不同的文化中,日期是以不同的格式书写的。e、 g.(五月三日)=2012年5月3日或2012年3月5日,依此类推
请检查当前文化,如下所示:
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-us");
因为在不同的文化中,日期是以不同的格式书写的。e、 g.(五月三日)=2012年5月3日或2012年3月5日,依此类推
您只需使用
DateTime.Parse()
()(或TryParse()
)方法即可完成此操作。请看以下示例代码:
string[] times = new string[]
{
"00:00 AM"
, "01:00 AM"
, "10:00 AM"
, "12:00 AM"
, "00:00 PM"
, "01:00 PM"
, "10:00 PM"
, "12:00 PM"
};
foreach (var time in times)
{
DateTime date = DateTime.Parse(time);
Console.WriteLine(date);
}
给出输出:
03/05/2012 00:00:00
03/05/2012 01:00:00
03/05/2012 10:00:00
03/05/2012 00:00:00
03/05/2012 12:00:00
03/05/2012 13:00:00
03/05/2012 22:00:00
03/05/2012 12:00:00
在您的情况下,只需创建一个包含“hour”的字符串:“minutes”+“AM”或“PM”。在代码中(如果输入无效,Parse()方法会引发异常或非常奇怪的结果):
您只需使用
DateTime.Parse()
()(或TryParse()
)方法即可完成此操作。请看以下示例代码:
string[] times = new string[]
{
"00:00 AM"
, "01:00 AM"
, "10:00 AM"
, "12:00 AM"
, "00:00 PM"
, "01:00 PM"
, "10:00 PM"
, "12:00 PM"
};
foreach (var time in times)
{
DateTime date = DateTime.Parse(time);
Console.WriteLine(date);
}
给出输出:
03/05/2012 00:00:00
03/05/2012 01:00:00
03/05/2012 10:00:00
03/05/2012 00:00:00
03/05/2012 12:00:00
03/05/2012 13:00:00
03/05/2012 22:00:00
03/05/2012 12:00:00
在您的情况下,只需创建一个包含“hour”的字符串:“minutes”+“AM”或“PM”。在代码中(如果输入无效,Parse()方法会引发异常或非常奇怪的结果):
当使用以下函数调用时,您的函数总是返回12:30 PM(中午):
GetDatetime(“AM”、“12”、“30”)代码>
正如Eric提到的,您得到不同结果的原因可能是这两台计算机以不同的方式打印日期
例如,使用“我的设置”,结果是:
2012-05-03 12:30:00(中午半小时,以我电脑的格式)
使用US设置,结果是:
2012年3月5日下午12:30:00(美国格式的中午半小时)
要在两台计算机上以相同的方式打印日期,可以指定用于日期格式设置的区域性信息:
DateTime dateResult = GetDatetime("AM", "12", "30");
string strResult = dateResult.ToString(System.Globalization.CultureInfo.GetCultureInfo("en-US"));
在所有计算机上,strResult将具有以下值:5/3/2012 12:30:00 PM
但最重要的是,您应该修复代码以获得预期的结果(上午12点应该是午夜,而不是中午)。当使用以下命令调用函数时,您的函数总是返回中午12:30 PM:GetDatetime(“AM”、“12”、“30”)代码>
正如Eric提到的,您得到不同结果的原因可能是这两台计算机以不同的方式打印日期
例如,使用“我的设置”,结果是:
2012-05-03 12:30:00(中午半小时,以我电脑的格式)
使用US设置,结果是:
2012年3月5日下午12:30:00(美国格式的中午半小时)
要在两台计算机上以相同的方式打印日期,可以指定用于日期格式设置的区域性信息:
DateTime dateResult = GetDatetime("AM", "12", "30");
string strResult = dateResult.ToString(System.Globalization.CultureInfo.GetCultureInfo("en-US"));
在所有计算机上,strResult将具有以下值:5/3/2012 12:30:00 PM
但最重要的是,您应该修复代码以获得预期的结果(上午12点应该是午夜,而不是中午)。您的机器没有设置为使用24小时时钟
服务器正在运行
以通常的方式改变,一切都会好起来:)
如何:
单击开始,然后单击控制面板。
单击日期、时间、语言和区域选项,然后单击区域和语言选项
要更改一个或多个单独设置,请单击“自定义”
进入时间标签,格式就在那里李>
您的机器未设置为使用24小时制
服务器正在运行
以通常的方式改变,一切都会好起来:)
如何:
单击开始,然后单击控制面板。
单击日期、时间、语言和区域选项,然后单击区域和语言选项
要更改一个或多个单独设置,请单击“自定义”
进入时间标签,格式就在那里李>
这不会影响编写的代码-不涉及字符串解析。@DanPuzey:Culture settings是OP认为他在两台计算机上得到不同结果的原因,尽管事实并非如此。请看我的答案。这不会影响编写的代码-不涉及字符串解析。@DanPuzey:区域性设置是OP认为他在两台计算机上得到不同结果的原因,尽管事实并非如此。看我的答案。你确认两台机器在同一时区吗?因为12:30实际上是00:30。嗨,克里斯,没错。这就是为什么我更新了我的代码。你现在有了工作代码,你想让我们发现其中的问题吗?我想你刚刚回答了你的问题!:)@阿丹:自从上个小时发生在我身上的事情之后,我再也不相信自己了。所以我只是让你们看看我是否忽略了一件事:你们确认了两台机器在同一时区吗?因为12:30实际上是00:30。嗨,克里斯,没错。这就是为什么我更新了我的代码。你现在有了工作代码,你想让我们发现其中的问题吗?我想你刚刚回答了你的问题!:)@阿丹:自从上个小时发生在我身上的事情之后,我再也不相信自己了。所以我只是让你们看看我是否忽略了一件事:pSo如何在两台机器上获得一致的日期?你能改变我的代码来反映它吗?那么我如何在两台机器上获得一致的日期呢?你能改变我的代码来反映它吗?嗨,Styxxy,你的答案看起来很有希望+我同意。但是我需要修正我的方法。非常简单和有用。非常感谢。嗨,Styxxy,你的答案看起来很有希望+我同意。但是我需要修正我的方法。非常简单和有用。非常感谢。嗨,克里斯,我知道,但我的代码与任何区域设置无关。我只想创建一个具有适当小时和分钟的DateTime对象。那是ab