1

我有这个方法:

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

4 回答 4

2

调用时,您的函数始终返回 12:30 PM(中午):GetDatetime("AM", "12", "30");

正如 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

但最重要的是,您应该修复您的代码以获得预期的结果(12AM 应该是午夜,而不是中午)。

于 2012-05-03T13:47:00.610 回答
1

请像这样检查当前的文化:

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

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

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

于 2012-05-03T13:44:11.667 回答
1

您可以简单地使用DateTime.Parse()( msdn link ) (or 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

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

public static DateTime GetDatetime(string ampm, string hour, string minute)
{
    return DateTime.Parse(hour + ":" + minute + " " + ampm);
}
于 2012-05-03T13:45:56.153 回答
0

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

服务器是。

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

如何:

  1. 单击开始,然后单击控制面板。
    1. 单击日期、时间、语言和区域选项,然后单击区域和语言选项。
    2. 要更改一项或多项单独设置,请单击自定义。
    3. 到时间标签,格式就在那里!
于 2012-05-03T13:52:24.613 回答