문제

우리는 ASP.NET 2.0 웹 응용 프로그램이 중서부 (동부 표준시)의 서버에서 작동하고 실행하고 있습니다. 현재 모든 고객은 서버와 같은 시간 영역에 있습니다. 우리는 애리조나 (Mountain Standard Time)에서 온라인으로 다른 서버를 온라인으로 가져오고 있습니다.

C# CodeBehind Datetime.utcNow를 통해 모든 시간을 SQL 2005 데이터베이스에 저장하고 있습니다.

테스트하는 동안 시간대 전환 문제가 발생했습니다. 우리의 문제는 웹 브라우저에서 타임즈가 동부 표준 시간을 테스트하는 시간대 대신 산 표준 시간을 표시한다는 것입니다.

새 정보를 입력하면 데이터베이스에서 UTC로 저장되지만 브라우저에서 해당 정보를 보러 가면 산 표준 시간이 표시됩니다. 아래는 데이터베이스에서 UTC 값을 가져와 브라우저에 표시하는 코드입니다.

lblUpdatedDate.Text = Convert.ToDateTime(dr["UpdatedDate"]).ToLocalTime().ToString();

위의 코드는 브라우저가 실행되는 동부 표준 시간이 아닌 서버가있는 산 표준 시간을 반환합니다. 사용자가 어디에 표시되는 시간을 어떻게 표시합니까?

도움이 되었습니까?

해결책

나는 같은 문제가 있었다. 우리는 웹 서버와 다른 시간대에 있던 사용자에게 응용 프로그램을 판매했습니다. 우리는 정보를 UTC에 저장하지 않았지만 실제로는 올바르게 작동했습니다. 서버의 시간대에 표시된 시간은 정확히 3 시간 뒤에 표시되었습니다. 우리가해야 할 일은 시간대 드롭 다운을 추가하여 전체 사이트의 시간대를 선택할 수있었습니다 (응용 프로그램의 유일한 사용자는 시간대에 있기 때문에). 이 설정을 저장 한 다음 TimezoneInfo 네임 스페이스를 사용하여 모든 데이터 타임 디스플레이를 가져 와서 한 시간 영역에서 다른 시간대로 변환하는 기능을 삽입했습니다. 완벽하게 작동합니다.

다른 팁

현지 시간으로 항상 서버 측면에서 물리적 위치로 변환됩니다. 몇 가지 옵션이 있습니다.

  1. UTC에서 사용자에게 오프셋 값을 저장하고 UTC에서 시간을 유지하십시오.
  2. JS를 통해 전환 클라이언트 측을 수행하십시오 (제 생각에는 우아하거나 적절하지 않음)
  3. 좀 봐 MSDN 추천 그리고 TimeZone 네임 스페이스

.NET 3.5를 사용하는 경우 그리고 사용자가있는 시간대를 알고 있습니다. Timezoneinfo 당신의 친구입니다. .NET 3.5를 사용하지 않는 경우 인스턴스를 얻기 위해 몇 가지 p/호출 샘플이 있습니다. 시간대, 그러나 3.5에 액세스 할 수 있다면 피할 가치가 있습니다. (TimezoneInfo는 과거 데이터 등을 가지고 있으며 일반적으로 선호하는 방법입니다.)

이제 사용자가 어떤 시간대에 있는지 확인하는 것은 다른 문제입니다. 혼란을 피하는 가장 간단한 방법은 옵션을 제공하는 것입니다. ( "지금"오프셋을 얻는 것은 제한된 정보 만 제공합니다.)

asp.net을 사용하기 전에 이와 같은 것을 만났습니다. 여기 저의 일반적인 방법론이있었습니다.

문서를 작성하기 위해 JavaScript를 보냈습니다. JavaScript는 GMT에서 클라이언트의 오프셋을 결정합니다. 따라서 특정 시간을 보내고 JavaScript가 플러스/마이너스를 수행하도록 할 수 있습니다.

항상 DateTime을 GMT 형식으로 저장하십시오.

두 단계가 있습니다.

JavaScript를 사용하여 클라이언트 측에서 다른 시간대 감지 :

var dt = new Date();
var diffInMinutes = -dt.getTimezoneOffset();

그런 다음 서버 측에서 C# 코드는 위의 감지 된 시간대 오프셋을 기반으로 서버 시간을 클라이언트 시간으로 변환합니다.

string queryStr = Request.QueryString["diffInMinutes"];
int diffInMinutes = 0;
if (Int32.TryParse(queryStr, out diffInMinutes))
{
    clientTime = serverTime.ToUniversalTime().AddMinutes(diffInMinutes);
}

우리는 데이터베이스와 클라이언트가 다른 시간에있는 웹 서비스를 통해 데이터베이스에 호출하는 원격 클라이언트와 동일하거나 유사한 문제를 해결했습니다.

우리는 데이터 세트에 타임 존에 신경 쓰지 않도록 지시하는 것이 가장 쉬운 것을 발견했습니다.

우리는 데이터 세트의 모든 날짜 시간 필드를 테이블별로 변환하는 유틸리티 방법 (setalldatemodes)을 구축했습니다.

foreach (DataColumn dc in dt.Columns)
{
  if (dc.DataType == typeof(DateTime))
  {
    dc.DateTimeMode = dateMode;
  }
}
SetAllDateModes(dt, DataSetDateTime.Unspecified);

DatesEtDateTime.unspecified에는 오프셋이 포함되어 있지 않으므로 변환이 없습니다.

일반적인 아이디어는 사용자에게 제시 할 때까지 날짜와 시간을 현지화하지 않는 것이라고 생각했습니다. 따라서 인간이 읽지 않으면 UTC, GMT, Cut에 머물러 있습니다. 하나의 추가 메모 날짜/시간 라이브러리를 사용하므로 일광 절약 시간 변경 문제에 대해 많이 걱정할 필요가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top