System.DateTime没有在Server中更新,但在Local中正常工作

时间:2013-10-28 12:54:10

标签: c# asp.net .net datetime

我已根据位置根据国家/地区下拉列表编写了一些代码来设置应用程序时间。它在本地工作正常,但一旦部署就无法在Server中工作,请帮助......

 Date Time AppTime = new DateTime();

  protected void Page_Load(object sender, EventArgs e)
  {  
   AppTime = new DateTime();
   //Time Zone Changes for other Countries            
   TimeZoneInfo tzi1 = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
   DateTime IndTime = DateTime.Now;
   DateTime CurrentUTC = TimeZoneInfo.ConvertTimeToUtc(IndTime);
   DateTime OzzieTime = TimeZoneInfo.ConvertTimeFromUtc(CurrentUTC, tzi1);

  string SelectedCountry = ddlCountry.SelectedValue.ToString();
  string Australia = ConfigurationManager.AppSettings["AustraliaCountryID"];

  if (SelectedCountry == Australia)
  {       
    AppTime = OzzieTime;
  }
  else
  {       
    AppTime = IndTime;
  }

        TextBox1.Text = AppTime.ToString();
        TextBox2.Text = DateTime.UtcNow.ToString();
        TextBox3.Visible = OzzieTime.ToString();;

2 个答案:

答案 0 :(得分:0)

您需要做的所有代码都是:

string tzid = SelectedCountry == Australia
              ? "AUS Eastern Standard Time"
              : "India Standard Time";

TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById(tzid);
DateTime appTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tz);

当然,你认为澳大利亚的所有时区都在一个时区,你犯了一个严重的错误。有关详细信息,请参阅this Wikipedia article

当您将代码发送到生产时,您的代码无效的原因可能是您依赖DateTime.Now成为印度代码。您的服务器很可能在另一个时区。例如,将服务器置于UTC中是最佳做法。

此外,认为您的用户只会位于两个不同时区之一,这有点愚蠢。您应该只使用TimeZoneInfo.GetSystemTimeZones()创建一个列表,使用每个项目的.Id.DisplayName

您可能还想确保您的服务器具有最新的Windows更新,或者您已手动应用Time Zone Updates

答案 1 :(得分:-3)

我有同样的问题,我建立了这个方法:

    private static DateTime getTodayNow(string timeZoneId="")
    {
        DateTime retVal = DateTime.Now;


        DateTime.TryParse(DateTime.Now.ToString("s"), out retVal);

        if (!string.IsNullOrEmpty(timeZoneId))
        {
            try
            {
                DateTime now = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second).ToUniversalTime();
                TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);//"Russian Standard Time");
                retVal = TimeZoneInfo.ConvertTimeFromUtc(now, easternZone);
            }
            catch (TimeZoneNotFoundExceptio‌​n ex)
            {
              //write to log!!
            }
        }
        return retVal;
    }