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