我已根据位置根据国家/地区下拉列表编写了一些代码来设置应用程序时间。它在本地工作正常,但一旦部署就无法在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();;
答案 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 (TimeZoneNotFoundException ex)
{
//write to log!!
}
}
return retVal;
}