Pergunta

Eu estou trabalhando em um "online lembrete projeto" sistema de (ASP.NET 2.0 (C#) e SQL Server 2005)

Como este é um lembrete de serviço que irá enviar o email para os usuários de um determinado datas.Mas o problema é que os usuários não são de um para países específicos, que são de todo o mundo e de diferentes fusos horários.Agora, Quando eu estou registrando eu estou pedindo para os usuários de fuso horário da mesma forma como o windows pede a nossa fuso horário no momento da instalação.

Mas eu não estou conseguindo o se o usuário selecionado (+5.30) ou algo do fuso-horário, em seguida, como lidar com esse fuso horário na minha asp.net aplicação.Como trabalhar de acordo com o fuso horário.

E, por favor, sugiro que, se não há nenhuma maneira melhor para lidar com fusos horários no aplicativo ??

Obrigado

Foi útil?

Solução

A primeira coisa é garantir em que fuso horário seus dados estão. Eu recomendaria garantir que qualquer tempo que você armazena seja armazenado no tempo da UTC (use o DateTime.ToUniversalTime() para se apossar disso).

Ao armazenar um lembrete para um usuário, você precisará do tempo atual do UTC, adicionar ou remover a diferença de fuso horário do usuário e converterá esse novo tempo de volta ao UTC; É isso que você deseja armazenar no banco de dados.

Então, quando você deseja verificar se há lembretes, basta procurar no banco de dados lembretes para enviar agora, de acordo com o UTC Time; essencialmente obtenha todos os lembretes que têm um carimbo de hora que é antes DateTime.Now.ToUniversalTime().

Atualizar com alguns detalhes de implementação: você pode obter uma lista de fusos horários do TimeZoneInfo.GetSystemTimeZones() método; Você pode usá -los para mostrar uma lista de fusos horários para o usuário. Se você armazenar o Id Propriedade do fuso horário selecionado, você pode criar uma instância da classe TimeZoneInfo a partir dela e calcular o tempo da UTC para uma determinada data/valor local:

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

Outras dicas

Eu recomendaria sempre Use o tempo UTC (GMT) no lado do servidor (em código-behind, banco de dados, etc.) e converter tempo de UTC para hora local para fins de exibição só. Isso significa que as manipulações de todos os tempos - incluindo o tempo de economia no banco de dados, a execução de cálculos etc. - devem ser feitas usando o UTC.

O problema é: como seu código-behind sabe qual é o fuso horário do navegador do cliente? Diga que o usuário insere algum valor de data/hora (como 12/30/2009 14:30) no formulário e o envia ao servidor. Supondo que o usuário enviasse horário local, como o servidor sabe como converter esse valor para o UTC?

O aplicativo pode solicitar ao usuário que especifique o fuso horário (e salvá -lo em um cookie ou banco de dados persistente), mas requer um esforço extra do usuário, e seu aplicativo precisaria implementar a lógica e as telas para isso. Seria melhor se o aplicativo pudesse Determine o fuso horário do cliente automaticamente.

Eu abordei esse problema com a ajuda do JavaScript's getTimeZoneoffset Função, que é a única API que pode informar ao servidor sobre a diferença horária entre a hora local no cliente e o GMT. Como essa é uma API do lado do cliente, fiz o seguinte: No lado do servidor, verifique um cookie de sessão personalizado que segura o valor do deslocamento do tempo e, se não estiver disponível, recarregue a página (apenas durante o GET e não poste, chamadas) Com alguma lógica JavaScript adicionada para gerar o deslocamento do tempo e salvá -lo no cookie. No lado do cliente, isso é quase transparente (uma vez durante a sessão, recarregue uma página no GET). Depois de compensar o cookie, aplico -o às funções de gerenciamento de tempo, dependendo da conversão da direção do tempo (UTC na hora local ou horário local para o UTC).

Isso pode parecer um pouco complicado, e é, mas depois que eu escrevi funções auxiliares, a integração desse recurso no site foi uma questão de fazer um chamada única Em Page_load (das páginas que precisavam de conversão de tempo) e usando rotinas de conversão de tempo ao enviar e recuperar valores de tempo de e para o navegador. Aqui está um exemplo de como ele pode ser usado:

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, ...);
     ...
  }
}
...
}

Se você precisar de mais detalhes, verifique o Já está na hora: localizar o tempo em aplicativos ASP.NET Artigo (desculpe, mas não tenho um link direto para o artigo no site do editor, já que o ASP.NETPRO restringe o acesso apenas a assinantes pagos; existem links para cópias em PDF). Eu gostaria de poder postar a amostra no artigo, mas não quero violar os direitos autorais; No entanto, aqui está um Projeto para construir uma biblioteca auxiliar isso tem Toda a funcionalidade e documentação necessárias (Apenas ignore as coisas que você não precisa).

ATUALIZAÇÃO: O artigo foi publicado on -line com o projeto de amostra pelo novo editor aqui.

O problema com todas as respostas até agora é que eles não levam em conta o que Prashant está tentando alcançar.Se o usuário do seu sistema, um dia antes do horário de verão economia alterações tem um deslocamento de +12 e define um lembrete para o dia seguinte, seu deslocamento quando o lembrete é suposto para ser acionado vai ser +13 em vez disso.

É por isso que você só pode usar o offset atual para algo que está acontecendo agora.Apesar de eu não concordar com todos os outros, que todos os momentos do lado do servidor (exceto, possivelmente, aqueles usados apenas para visualização) devem ser armazenados em UTC.

Você pode querer ver o uso do DateTimeOffset Estrutura em vez do DateTime, se você estiver na estrutura 2.0 ou posterior.

O DateTimeOffset representa um ponto no tempo em relação ao tempo da UTC, por isso deve ser mais fácil trabalhar neste caso.

Existem 2 etapas:

  • Detecte o fuso horário diferente no lado do cliente usando JavaScript:

    var dt = new Date();
    var diffInMinutes = -dt.getTimezoneOffset();
    
  • Em seguida, no lado do servidor, o código C# para converter o tempo do servidor no tempo do cliente com base no deslocamento do fuso horário detectado acima:

------------------------;

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

Basicamente, tudo o que você precisa fazer é adicionar o deslocamento (horas + minutos) ao horário local em que o usuário inseriu. A adição do deslocamento basicamente fornece um datetime no fuso horário do UTC (basicamente GMT).

Geralmente, é mais fácil padronizar todos os seus tempos para o UTC, para que sua lógica de aplicativo não precise lidar com as compensações.

Esta página tem alguns bons exemplos: http://msdn.microsoft.com/en-us/library/bb546099.aspx

A questão é que a compensação da UTC varia em diferentes épocas do ano - cada fuso horário tem suas próprias regras. (Aprendi isso da maneira mais difícil ao desenvolver o aplicativo de programação da sala de reuniões.)

Parece que há suporte embutido aqui: http://msdn.microsoft.com/en-us/library/system.timezoneinfo.converttime.aspx

Eu mesmo não tentei, mas parece prometer a conversão correta, representando a economia do dia.

Caso contrário, aqui está uma ferramenta comercial (cara) que usei: http://www.worldtimeserver.com/time_zone_guide/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top