45 votes

D'où viennent les 75 secondes supplémentaires?

Lors de l'écriture de tests unitaires sur un Jour Julien de la calculatrice, j'ai trouvé que les dates antérieures au 2 décembre 1847 étaient en cours d'initialisation incorrecte par NSDate. Ils semblent avoir 75 secondes. Je n'ai pas été en mesure de trouver quelque chose pointant vers cette date (ce qui est bien après le calendrier Grégorien fréquence de coupure). Est-ce un bug ou est-il un historique de l'ajustement de calendrier que je n'ai pas trouver?

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

Sortie:

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

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

93voto

Richard Krajunus Points 692

Selon http://www.timeanddate.com/worldclock/clockchange.html?n=136&year=1847, il y avait un décalage de 75 secondes à ce moment-là.

À Londres, lorsque l'heure locale était sur le point d'arriver à minuit le mercredi 1 er décembre 1847, l'heure était avancée au mercredi 1er décembre 1847 à 12 h 01 min 15 s.

22voto

Ricky Romero Points 333

En réponse au message de Richard Krajunus , voici quelques informations supplémentaires issues de la base de données zoneinfo utilisée par la plupart des ordinateurs pour suivre ces types de modifications:

 # 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.
 

Désolé, je n'ai pas pu répondre en utilisant un commentaire dans ce fil; StackOverflow ne me considère pas encore digne de cela.

3voto

pixel Points 2842

Si vous utilisez une sorte de manipulation Date / Heure, vous devez consulter la FAQ du calendrier . Il répond à toutes les questions comme celle-ci.

1voto

greymouser Points 1177

Est-ce un bug ou est-il un historique de l'ajustement de calendrier que je n'ai pas trouver?

Il y a eu un certain nombre de fois que le calendrier a été ... fixe dans le passé.

Cochez la case "adoption" articles de les articles de wikipédia pour Julien et Grégorien calendriers.

Le NSDate instance doit toujours être la bonne date pour quel que soit le fuseau horaire qu'il a été initialisé avec, cependant.

0voto

Eugene Points 6015

NSDateComponents utilisent votre fuseau horaire local. Essayez de régler le fuseau horaire sur 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X