문제

"온라인 알림 시스템"프로젝트 (ASP.NET 2.0 (C#) / SQL Server 2005)에서 작업 중입니다.

이것은 특정 날짜에 사용자에게 메일을 보내는 알림 서비스입니다. 그러나 문제는 사용자가 특정 국가 출신이 아니라 전 세계와 다른 시간대 출신입니다. 이제 등록 할 때 Windows가 설치시 시간대를 요구하는 것과 같은 방식으로 사용자 시간대를 요구하고 있습니다.

그러나 IF 사용자가 선택한 IF를 얻지 못하거나 시간대가 ASP.NET 응용 프로그램 에서이 시간 영역을 처리하는 방법을 얻지 못합니다. 시간대에 따라 일하는 방법.

이 응용 프로그램에서 시간 존을 처리하는 더 좋은 방법이 있는지 제안하십시오.

감사

도움이 되었습니까?

해결책

첫 번째는 데이터가 어떤 시간대에 있는지 확인하는 것입니다. 저장하는 모든 데이터가 UTC 시간에 저장되는지 확인하는 것이 좋습니다 (사용하십시오. DateTime.ToUniversalTime() 그것을 붙잡기 위해).

사용자를위한 알림을 저장하려면 현재 UTC 시간이 필요하고 사용자의 시간대 차이를 추가 또는 제거하고 해당 새 시간을 UTC로 전환해야합니다. 이것이 DB에 저장하려는 것입니다.

그런 다음 전송 할 미리 알림을 확인하려면 UTC 시간에 따라 알려진 알림을 받으려면 데이터베이스를 검토하면됩니다. 본질적으로 시간 스탬프가있는 모든 알림을 받으십시오. DateTime.Now.ToUniversalTime().

업데이트 일부 구현 세부 사항이 포함되어 있습니다. TimeZoneInfo.GetSystemTimeZones() 방법; 이를 사용하여 사용자를위한 시간 영역 목록을 표시 할 수 있습니다. 당신이 저장한다면 Id 선택한 시간대에서 속성에서 TimezoneInfo 클래스 인스턴스를 생성하고 주어진 로컬 날짜/시간 값에 대한 UTC 시간을 계산할 수 있습니다.

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("<the time zone id>");
// May 7, 08:04:00
DateTime userDateTime = new DateTime(2009, 5, 7, 8, 4, 0);
DateTime utcDateTime = userDateTime.Subtract(tzi.BaseUtcOffset);

다른 팁

나는 항상 추천합니다 서버 측에서 UTC (GMT) 시간을 사용하십시오. (Code-Behind, 데이터베이스 등) 및 UTC에서 시간을 변환합니다. 디스플레이 목적으로 현지 시간 뿐. 이는 데이터베이스의 시간 절약, 계산 수행 등을 포함하여 모든 시간 조작을 UTC를 사용하여 수행해야 함을 의미합니다.

문제는 다음과 같습니다. Code-Behind는 클라이언트 브라우저의 시간대가 무엇인지 어떻게 알 수 있습니까? 사용자가 날짜/시간 값을 입력한다고 가정합니다 (예 : 12/30/2009 14:30) 형식으로 서버에 제출합니다. 사용자가 현지 시간을 제출했다고 가정하면 서버는이 값을 UTC로 변환하는 방법을 어떻게 알 수 있습니까?

응용 프로그램은 사용자에게 시간대를 지정하도록 요청할 수 있으며 (지속적인 쿠키 또는 데이터베이스에 저장) 사용자의 추가 노력과 추가 노력이 필요하며 앱은 이에 대한 논리와 화면을 구현해야합니다. 앱이 할 수 있다면 더 좋을 것입니다 클라이언트의 시간대를 자동으로 결정하십시오.

JavaScript의 도움 으로이 문제를 해결했습니다. gettimezoneoffset 기능, 이는 클라이언트와 GMT의 현지 시간의 시차에 대해 서버에 알릴 수있는 유일한 API입니다. 이것은 클라이언트 측 API이므로 다음을 수행했습니다. 서버 측면에서 시간 오프셋 값을 보유한 사용자 정의 세션 쿠키를 확인하고 사용할 수없는 경우 페이지를 다시로드합니다 (Get, 게시되지 않은 경우에만 호출). 시간 오프셋을 생성하고 쿠키에 저장하기 위해 일부 JavaScript 로직이 추가되었습니다. 클라이언트 측에서 이것은 거의 투명합니다 (세션 중에 한 번은 페이지를 다시로드합니다). 쿠키에 오프셋이 있으면 시간 변환 방향 (UTC에서 현지 시간 또는 현지 시간)에 따라 시간 관리 기능에 적용합니다.

이것은 약간 복잡하게 들릴 수 있지만,이 헬퍼 기능을 작성한 후 사이트 에이 기능을 통합하는 것은 단일 통화 page_load (시간 변환이 필요한 페이지)에서, 시간 값을 브라우저로 보내고 검색 할 때 시간 변환 루틴을 사용합니다. 다음은 사용 방법의 예입니다.

using My.Utilities.Web;
...

// Derive the form class from BaseForm instead of Page.
public class WebForm1: BaseForm
{
...
private void Page_Load(object sender, System.EventArgs e)
{
  // If we only want to load the page to generate the time
  // zone offset cookie, we do not need to do anything else.
  if (InitializeLocalTime())
    return;

  // Assume that txtStartDate is a TextBox control.
  if (!IsPostback)
  {
     // To display a date-time value, convert it from GMT (UTC)
     // to local time.
     DateTime startDate = GetStartDateFromDB(...);
     txtStartDate.Text  = FormatLocalDate(startDate);
     ...
  }
  else
  {
     // To save a date-time value, convert it from local
     // time to GMT (UTC).
     DateTime tempDate  = DateTime.Parse(txtStartDate.Text);
     DateTime startDate = ConvertLocalTimeToUtc(tempDate);
     SaveStartDateInDB(startDate, ...);
     ...
  }
}
...
}

더 자세한 내용이 필요한 경우 시간이 지났는데 : ASP.NET 응용 프로그램에서 시간을 현지화 ASP.NETPRO는 유료 가입자에 대한 액세스를 제한하고 PDF 사본에 대한 링크가 있기 때문에 기사 (죄송하지만 게시자 사이트의 기사에 대한 직접 링크는 없습니다). 기사에서 샘플을 게시 할 수 있기를 바랍니다. 그러나 저작권을 위반하고 싶지는 않습니다. 그러나 여기에 a 도우미 도서관을 구축하기위한 프로젝트 그건 가지고 있습니다 필요한 모든 기능 및 문서 (필요하지 않은 것들을 무시하십시오).

업데이트 : 기사는 새 게시자가 샘플 프로젝트와 함께 온라인으로 게시되었습니다. 여기.

지금까지 모든 답변의 문제는 Prashant가 달성하려는 것을 고려하지 않는다는 것입니다. 일광 절약 전날에 그의 시스템 사용자가 +12의 오프셋을 가지고 다음 날 알림을 설정하면 알림이 트리거 될 때 오프셋이 대신 +13이됩니다.

그렇기 때문에 지금 일어나고있는 일에 대해서만 현재 오프셋을 사용할 수 있습니다. 나는 다른 모든 사람들과 동의하지만, 모든 시간 서버 측 (디스플레이에만 사용되는 것만 제외)은 UTC에 저장되어야한다는 것에 동의합니다.

사용을보고 싶을 수도 있습니다 dateTimeOffset 프레임 워크 2.0 이상인 경우 DateTime 대신 구조.

DateTimeOffSet은 UTC 시간에 비해 시점을 나타내 므로이 경우 작업하기가 더 쉬워야합니다.

두 단계가 있습니다.

  • 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);
}

기본적으로, 사용자가 입력 한 현지 시간에 오프셋 (시간 + 분)을 추가하면됩니다. 오프셋에 추가하면 기본적으로 UTC (기본적으로 GMT) 타임 존에서 DateTime을 제공합니다.

응용 프로그램 로직이 오프셋을 처리 할 필요가 없도록 모든 시간을 UTC로 표준화하는 것이 일반적으로 가장 쉽습니다.

이 페이지에는 몇 가지 좋은 예가 있습니다. http://msdn.microsoft.com/en-us/library/bb546099.aspx

문제는 UTC의 오프셋이 연중 시간에 따라 다를 것이라는 점입니다. 각 시간대에는 자체 규칙이 있습니다. (회의실 스케줄링 앱을 개발할 때 이것을 어려운 방법으로 배웠습니다.)

여기에는 내장 지원이있는 것 같습니다. http://msdn.microsoft.com/en-us/library/system.timezoneinfo.converttime.aspx

직접 시도하지는 않았지만 일광 절약을 설명하는 올바른 전환을 약속하는 것 같습니다.

그렇지 않다면 여기에 내가 사용한 (비싼) 상업용 도구가 있습니다. http://www.worldtimeserver.com/time_zone_guide/

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