objective-c nsdate nsdatecomponents

objective c - ¿De dónde vienen los 75 segundos extra?



objective-c nsdate (5)

Mientras escribía algunas pruebas unitarias en una calculadora Julian Day, encontré que NSDate inicializaba incorrectamente las fechas anteriores al 2 de diciembre de 1847. Parece que tienen 75 segundos agregados. No he podido encontrar nada que apunte a esa fecha (que está bastante después del corte del calendario gregoriano). ¿Es un error o hay un ajuste histórico del calendario que no he encontrado?

int main(int argc, const char * argv[]) { @autoreleasepool { NSCalendar *cal = [NSCalendar currentCalendar]; NSDateComponents *dateComps = [NSDateComponents new]; dateComps.year = 1847; dateComps.month = 12; dateComps.day = 1; NSDate *d1 = [cal dateFromComponents:dateComps]; NSLog(@"d1 = %@", d1); dateComps = [NSDateComponents new]; dateComps.year = 1847; dateComps.month = 12; dateComps.day = 2; NSDate *d2 = [cal dateFromComponents:dateComps]; NSLog(@"d2 = %@", d2); } return 0; }

Salida:

d1 = 1847-12-01 00:01:15 +0000

d2 = 1847-12-02 00:00:00 +0000



En respuesta a la publicación de Richard Krajunus , aquí hay información adicional de la base de datos de zona utilizada por la mayoría de las computadoras para rastrear este tipo de cambios:

# From Paul Eggert (1993-11-18): # # Howse writes that Britain was the first country to use standard time. # The railways cared most about the inconsistencies of local mean time, # and it was they who forced a uniform time on the country. # The original idea was credited to Dr. William Hyde Wollaston (1766-1828) # and was popularized by Abraham Follett Osler (1808-1903). # The first railway to adopt London time was the Great Western Railway # in November 1840; other railways followed suit, and by 1847 most # (though not all) railways used London time. On 1847-09-22 the # Railway Clearing House, an industry standards body, recommended that GMT be # adopted at all stations as soon as the General Post Office permitted it. # The transition occurred on 12-01 for the L&NW, the Caledonian, # and presumably other railways; the January 1848 Bradshaw''s lists many # railways as using GMT. By 1855 the vast majority of public # clocks in Britain were set to GMT (though some, like the great clock # on Tom Tower at Christ Church, Oxford, were fitted with two minute hands, # one for local time and one for GMT). The last major holdout was the legal # system, which stubbornly stuck to local time for many years, leading # to oddities like polls opening at 08:13 and closing at 16:13. # The legal system finally switched to GMT when the Statutes (Definition # of Time) Act took effect; it received the Royal Assent on 1880-08-02. # # In the tables below, we condense this complicated story into a single # transition date for London, namely 1847-12-01. We don''t know as much # about Dublin, so we use 1880-08-02, the legal transition time.

Lo siento, no pude responder usando un comentario en ese hilo; no me considera digno de eso todavía.


NSDateComponents está utilizando su zona horaria local. Intenta configurar el timezone en UTC?

NSCalendar *cal = [NSCalendar currentCalendar]; NSDateComponents *dateComps = [NSDateComponents new]; dateComps.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; dateComps.year = 1847; dateComps.month = 12; dateComps.day = 1; NSDate *d1 = [cal dateFromComponents:dateComps]; NSLog(@"d1 = %@", d1); dateComps = [NSDateComponents new]; dateComps.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; dateComps.year = 1847; dateComps.month = 12; dateComps.day = 2; NSDate *d2 = [cal dateFromComponents:dateComps]; NSLog(@"d2 = %@", d2); [19875:60b] d1 = 1847-12-01 00:00:00 +0000 [19875:60b] d2 = 1847-12-02 00:00:00 +0000



¿Es un error o hay un ajuste histórico del calendario que no he encontrado?

Hubo un número de veces que el calendario fue ... reparado en el pasado.

Consulte las secciones de "adopción" de los artículos de wikipedia para Julian y Gregorian .

Sin embargo, la instancia de NSDate siempre debe mostrar la fecha correcta para la zona horaria en la que se inicializó.