DateTime这种奇怪行为的原因?

时间:2012-05-03 13:36:58

标签: 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)
                iHour = 12 + iHour;

            DateTime dtTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                DateTime.Now.Day, iHour, iMinute, 0);

            return dtTime;
        }

基本上接受AM / PM和小时和分钟并给出DateTime。我提供输入

   DateTime startTIme = GetDatetime("AM", "12", "30");

我早上12:30在我的本地机器上得到正确的时间。但是,当我在服务器上运行相同的方法时,我得到12:30 PM。这让我疯了。有人可以帮帮我吗?我做错了什么?

更新

我的新功能是:

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;
        }

这似乎工作正常。任何人都可以在此代码中找到任何问题吗?

4 个答案:

答案 0 :(得分:2)

当使用GetDatetime("AM", "12", "30");

调用时,您的功能始终在12:30 PM(中午)返回

正如Eric所说,你得到不同结果的原因可能是两台计算机以不同的方式打印出日期。

例如,使用我的设置,结果为:

  

2012-05-03 12:30:00(我计算机格式的中午半小时)

使用美国设置后,结果为:

  

2012年5月3日下午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点应该是午夜,而不是中午)。

答案 1 :(得分:1)

请检查当前的文化:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-us");

因为在不同的文化中,日期以不同的格式书写。例如(可能是第3次)= 3/5/2012或5/3/2012等等

http://msdn.microsoft.com/en-us/library/system.threading.thread.currentculture.aspx

答案 2 :(得分:1)

您只需使用DateTime.Parse()msdn link)(或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

在您的情况下,只需创建一个包含“小时”的字符串:“分钟”+“AM”或“PM”。在代码中(如果你的输入无效,Parse()方法抛出一个异常或者一个非常奇怪的结果)):

public static DateTime GetDatetime(string ampm, string hour, string minute)
{
    return DateTime.Parse(hour + ":" + minute + " " + ampm);
}

答案 3 :(得分:0)

您的机器未设置为使用24小时制

服务器是。

以通常的方式改变,一切都会好的:)

如何:

  1. 单击“开始”,然后单击“控制面板”。
    1. 单击“日期,时间,语言和区域选项”,然后单击“区域和语言选项”。
    2. 要更改一个或多个单独设置,请单击“自定义”。
    3. 有时间标签,格式就在那里!