Se ajudar, pense nas temperaturas. Eles podem ser expressos em Fahrenheit, Celsius ou Kelvin. Mas a informação que está sendo expressa (o movimento médio das moléculas) não tem unidade intrínseca, embora só seja significativa para nós quando expressa em alguma unidade.
software evoluiu
7
O @DaveDeLong NSDate possui um fuso horário. Na referência da classe NSDate: "Este método retorna um valor de tempo relativo a uma data de referência absoluta - o primeiro instante de 1 de janeiro de 2001, GMT". Observe a referência clara e específica ao GMT.
Murray Sagal
3
Discordo. O NSDate NÃO possui um fuso horário. Para especificar o fuso horário para o NSDate, use um objeto NSCalendar ou um objeto NSDateFormatter. Se você criar um NSDate a partir de uma sequência que não possui fuso horário especificado, o NSDate assumirá que a sequência está no horário GMT.
Rickster
1
@MurraySagal Só porque esse método específico retorna um valor de tempo relativo a uma data em um fuso horário específico, não significa que o NSDate modela uma data como sendo relativa a um fuso horário.
eremzeit
Respostas:
139
NSTimeInterval seconds;// assume this existsNSDate* ts_utc =[NSDate dateWithTimeIntervalSince1970:seconds];NSDateFormatter* df_utc =[[[NSDateFormatter alloc] init] autorelease];[df_utc setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];[df_utc setDateFormat:@"yyyy.MM.dd G 'at' HH:mm:ss zzz"];NSDateFormatter* df_local =[[[NSDateFormatter alloc] init] autorelease];[df_local setTimeZone:[NSTimeZone timeZoneWithName:@"EST"]];[df_local setDateFormat:@"yyyy.MM.dd G 'at' HH:mm:ss zzz"];NSString* ts_utc_string =[df_utc stringFromDate:ts_utc];NSString* ts_local_string =[df_local stringFromDate:ts_utc];// you can also use NSDateFormatter dateFromString to go the opposite way
provavelmente vale a pena mencionar que você pode usar o formatador para ler datas também de strings
slf
34
@DaveDeLong está tudo bem se você estiver apenas exibindo a data como uma string. Mas há razões perfeitamente válidas para fazer conversões de fuso horário em uma data. Por exemplo, se você desejar padronizar a data em um UIDatePicker usando setDate :. As datas retornadas pelos serviços da web geralmente são UTC, mas representam um evento no fuso horário local do usuário, como uma listagem de TV. Passar em uma data não convertida exibirá a hora incorreta no selecionador.
Christopher Pickslay
5
@GlennMaynard Eu discordo. A essência dessa resposta é que nenhuma conversão para o NSDateobjeto é necessária, o que é correto. A conversão para um fuso horário ocorre quando a data é formatada, não quando é criada, porque as datas não possuem fuso horário.
Dave DeLong
1
@GlennMaynard ... exceto que NSCalendarDateestá obsoleto.
EDITAR Quando escrevi isso, não sabia que deveria usar um formatador de data que provavelmente é uma abordagem melhor, então confiraslf também a resposta.
Eu tenho um serviço da web que retorna datas no UTC. Eu uso toLocalTimepara convertê-lo para a hora local etoGlobalTime para converter novamente, se necessário.
Não faça isso. Os NSDates estão sempre em UTC. Isso apenas confunde o problema.
precisa saber é o seguinte
13
Isso pode ser muito útil para o caso "webservice" mencionado acima. Digamos que você tenha um servidor que armazene eventos no UTC e o cliente queira solicitar todos os eventos que ocorreram hoje. Para fazer isso, o cliente precisa obter a data atual (UTC / GMT) e depois alterá-la pelo deslocamento do fuso horário antes de enviá-la ao servidor.
Taylor Lafrinere
@ JeremyP Seria mais preciso dizer que os NSDates estão sempre no GMT. Na referência da classe NSDate: "Este método retorna um valor de tempo relativo a uma data de referência absoluta - o primeiro instante de 1 de janeiro de 2001, GMT". Observe a referência clara e específica ao GMT. Existe uma diferença técnica entre GMT e UTC, mas isso é irrelevante para as soluções que a maioria das pessoas procura.
Essa resposta parece mais portátil. A resposta abaixo assume que o fuso horário é fixado no tempo de execução, enquanto a resposta acima deriva o fuso horário da plataforma.
bleeckerj
9
Muito útil. Uma adição secondsFromGMTForDatedeve ser usada se você quiser considerar o horário de verão. Veja Apple Docs
Sergey Markelov
1
Isso não leva em consideração as alterações de horário de verão.
Lkraider 17/11
36
Swift 3+ : UTC para Local e Local para UTC
extension Date{// Convert UTC (or GMT) to local time
func toLocalTime()->Date{let timezone =TimeZone.current
let seconds =TimeInterval(timezone.secondsFromGMT(for:self))returnDate(timeInterval: seconds, since:self)}// Convert local time to UTC (or GMT)
func toGlobalTime()->Date{let timezone =TimeZone.current
let seconds =-TimeInterval(timezone.secondsFromGMT(for:self))returnDate(timeInterval: seconds, since:self)}}
Ótima resposta! Isso pegará a data atual. Uma adaptação disso que usa uma string de data seria substituída [NSDate date]por [NSDate dateWithNaturalLanguageString:sMyDateString].
//This is basic way to get time of any GMT time.NSDateFormatter*formatter =[[NSDateFormatter alloc] init];[formatter setDateFormat:@"hh:mm a"];// 09:30 AM[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:1]];// For GMT+1NSString*time =[formatter stringFromDate:[NSDate date]];// Current time
Como ninguém parecia estar usando NSDateComponents, pensei em incluir um ... Nesta versão, no NSDateFormatteré usado, portanto, nenhuma análise de string e NSDatenão é usado para representar o tempo fora do GMT (UTC). O original NSDateestá na variável i_date.
NSCalendar*anotherCalendar =[[NSCalendar alloc] initWithCalendarIdentifier:i_anotherCalendar];
anotherCalendar.timeZone =[NSTimeZone timeZoneWithName:i_anotherTimeZone];NSDateComponents*anotherComponents =[anotherCalendar components:(NSCalendarUnitEra|NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond|NSCalendarUnitNanosecond) fromDate:i_date];// The following is just for checking
anotherComponents.calendar = anotherCalendar;// anotherComponents.date is nil without thisNSDate*anotherDate = anotherComponents.date;
i_anotherCalendarpoderia ser NSCalendarIdentifierGregorianou qualquer outro calendário. O NSStringpermitido i_anotherTimeZonepode ser adquirido com [NSTimeZone knownTimeZoneNames], mas anotherCalendar.timeZonepode ser [NSTimeZone defaultTimeZone]ou [NSTimeZone localTimeZone]ou[NSTimeZone systemTimeZone] completamente.
Na verdade, ele está anotherComponentsmantendo o horário no novo fuso horário. Você notará que anotherDateé igual a i_date, porque mantém o tempo em GMT (UTC).
Respostas:
Tabela de formatação dos parâmetros da string:
https://waracle.com/iphone-nsdateformatter-date-formatting-table/
Se o desempenho for uma prioridade, considere usar
strftime
https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/strftime.3.htmlfonte
NSDate
objeto é necessária, o que é correto. A conversão para um fuso horário ocorre quando a data é formatada, não quando é criada, porque as datas não possuem fuso horário.NSCalendarDate
está obsoleto.EDITAR Quando escrevi isso, não sabia que deveria usar um formatador de data que provavelmente é uma abordagem melhor, então confira
slf
também a resposta.Eu tenho um serviço da web que retorna datas no UTC. Eu uso
toLocalTime
para convertê-lo para a hora local etoGlobalTime
para converter novamente, se necessário.Foi aqui que recebi minha resposta:
https://agilewarrior.wordpress.com/2012/06/27/how-to-convert-nsdate-to-different-time-zones/
fonte
O método mais fácil que encontrei é o seguinte:
fonte
secondsFromGMTForDate
deve ser usada se você quiser considerar o horário de verão. Veja Apple DocsSwift 3+ : UTC para Local e Local para UTC
fonte
Se você deseja local Data e hora. Experimente este código: -
fonte
[NSDate date]
por[NSDate dateWithNaturalLanguageString:sMyDateString]
.Converta sua data UTC em Data Local
Use como este
fonte
Aqui, a entrada é uma string currentUTCTime (no formato 30/08/2012 11:11) converte o tempo de entrada no GMT para o fuso horário definido pelo sistema
fonte
fonte
Converta a data do calendário UTC em uma com o NSTimeZone local apropriado .
fonte
Escrevo este método para converter data e hora em nosso LocalTimeZone
-Here (NSString *) O parâmetro TimeZone é um fuso horário do servidor
fonte
Como ninguém parecia estar usando
NSDateComponents
, pensei em incluir um ... Nesta versão, noNSDateFormatter
é usado, portanto, nenhuma análise de string eNSDate
não é usado para representar o tempo fora do GMT (UTC). O originalNSDate
está na variáveli_date
.i_anotherCalendar
poderia serNSCalendarIdentifierGregorian
ou qualquer outro calendário. ONSString
permitidoi_anotherTimeZone
pode ser adquirido com[NSTimeZone knownTimeZoneNames]
, masanotherCalendar.timeZone
pode ser[NSTimeZone defaultTimeZone]
ou[NSTimeZone localTimeZone]
ou[NSTimeZone systemTimeZone]
completamente.Na verdade, ele está
anotherComponents
mantendo o horário no novo fuso horário. Você notará queanotherDate
é igual ai_date
, porque mantém o tempo em GMT (UTC).fonte
Você pode tentar este:
fonte
Converta a hora UTC no fuso horário atual.
função de chamada
Função
fonte