Conversion de temps de 12 heures


10

Défi

Convertissez et imprimez une heure au format 12 heures. HH:MM AM/PM

Exemples

Contribution:

  • 'Fri Jun 30 2017 21:14:20 GMT-0700 (PDT)'
  • 'Fri Jun 30 2017 00:10:23 GMT-0700 (PDT)'
  • 'Fri Jun 30 2017 12:10:23 GMT-0700 (PDT)'
  • 'Sat Jun 31 2018 8:06:20 GMT-0700 (PDT)'
  • 'Fri Jul 01 2017 01:14:20 GMT-0700 (PDT)'
  • 'Sat Apr 10 2020 09:06:20 GMT-0700 (PDT)'

Sortie:

  • 9:14 PM
  • 12:10 AM
  • 12:10 PM
  • 08:06 AM
  • 1:14 AM
  • 09:06 AM

Fine Points

  • Un zéro avant un nombre à un chiffre est correct , aucun zéro n'est également autorisé. Les exemples suivants sont tous deux autorisés :

    • 9:06 AM

    • 09:06 AM

  • Toutes les années testées seront après 999(chaque année sera exactement des 4 chiffres)

Règles


Cas de test suggérés: 00:10:23 --> 12:10 AMet 12:10:23 --> 12:10 PM.
Arnauld

nous y voilà. N'hésitez pas à modifier si vous voyez autre chose que je devrais changer. Merci pour la suggestion!
Zoecarver


2
Pouvons-nous supposer que l'heure est indiquée dans le fuseau horaire dans lequel le programme est exécuté? (par exemple 'Fri Jun 30 2017 21:14:20 GMT-0400 (EDT)'pour moi)
ETHproductions

9
euh, le 31 juin n'existe pas. Est-ce exact?
Eric Lagergren

Réponses:


7

JavaScript (ES6), 69 octets

d=>new Date(d).toLocaleString(0,{hour:n='numeric',minute:n,hour12:1})


JavaScript (ES6), 58 55 octets

Suppose que vous êtes aux États-Unis.

d=>new Date(d).toLocaleTimeString().replace(/:.. /,' ')


JavaScript (ES6), 81 78 octets

La réponse avant d'émettre un 0 de tête en heures à un chiffre a été rendue facultative et des cas de test sans 0 de tête ont été ajoutés.

d=>([m,s]=d.slice(16).split`:`,`0${m%12||12}:${s} ${m<12?'A':'P'}M`.slice(-8))


1
Je pensais à changer ${m>12?'P':'A'}Mpour ${"AP"[m>12]}M, mais cela ne fonctionne pas sans convertir l'index en un entier (comme avec |0), ce qui lui donne la même longueur. Joliment joué au golf.
kamoroso94

Vous pouvez omettre ,21dans la tranche pour enregistrer 3 octets.
Rick Hitchcock

Renvoie 00h10 pour Fri Jun 30 2017 12:10:23 GMT-0700 (PDT). Devrait être PM. Changer m>12pour m>11devrait le réparer.
Rick Hitchcock

pour vous faire économiser 4 octets:d=>(new Date(d).toLocaleString(0,{hour:'numeric',minute:'numeric',hour12:1}))
zoecarver

En fait, vous pourriez réellement économiser 25 octets avec les éléments suivants:d=>(new Date(d).toLocaleTimeString().replace(/:\d+/,''))
zoecarver

6

Python 2 , 66 octets

lambda s:`int(s[15:18])%12`+s[18:21]+'  APMM'[int(s[15:18])>11::2]

Essayez-le en ligne!


Cela échoue pendant des années qui ont moins de 4 chiffres (bien que je ne sais pas si cela doit fonctionner avec ceux-ci).
notjagan

Je pense que ça va.
Zoecarver

@notjagan ce n'est pas nécessaire, comme le dit la question.
Fedone

@totallyhuman Oups, désolé.
Fedone

Pouvez-vous changer int(s[15:18])>11pour s[15:18]>"11"?
ETHproductions

5

sh + coreutils, 22 octets

date +%I:%M\ %p -d"$1"

(Si les secondes sont autorisées, cela date +%r -d"$1"suffit.)


très peu d'octets! également bien fait
zoecarver

4

JavaScript (ES6), 77 octets

Suppose que l'année comporte 4 chiffres.

s=>`${([,,,h,m]=s.match(/\d./g),x=h%12||12)>9?x:'0'+x}:${m} ${'AP'[h/12|0]}M`

Cas de test


Comme ci-dessus, j'ai trouvé un moyen plus petit de créer et de répondre. N'hésitez pas à utiliser mon code, je ne pense pas que ce soit vraiment le prix de répondre à ma propre question. d=>(new Date(d).toLocaleTimeString().replace(/:\d+/,''))
Zoecarver

@pudility Cela ne fonctionnerait que si votre Locale est en-USet votre fuseau horaire est GMT-0700 (PDT). Par exemple, aucune de ces hypothèses n'est vraie pour moi.
Arnauld


1

V , 36 octets

16x3wC AMÇ^0ü^1[0-2]/12WrP
ç^ä:/é0

Essayez-le en ligne!

Hexdump:

00000000: 3136 7833 7743 2041 4d1b c75e 30fc 5e31  16x3wC AM..^0.^1
00000010: 5b30 2d32 5d2f 3132 1857 7250 0ae7 5ee4  [0-2]/12.WrP..^.
00000020: 3a2f e930                                :/.0

1

PHP, 45 octets

Réponse améliorée grâce au manatwork

<?=(new DateTime($argv[1]))->format('h:i A');

Premier essai:

<? $d=new DateTime($argv[1]);echo$d->format('h:i A');

Exemple d'utilisation via php CLI:

php d.php "Sat Apr 10 2020 09:06:20 GMT-0700 (PDT)"

Ceci est mon premier essai de golf.


Pas besoin de variables $det de cette façon vous pouvez vous débarrasser de l'explicite echo: <?=(new DateTime($argv[1]))->format('h:i A');.
manatwork

1

Gelée , 43 octets

Ḳ5ịṣ”:Ṗṁ3µV’%12‘Dµ1¦µV>11ị⁾PAµ3¦“0: M”żFṫ-7

Essayez-le en ligne!

C'est superflu trop long ! Autrement dit, Jelly suce à la manipulation du temps.

EDIT: je suis même dépassé par PHP!





0

C #, 145 octets

namespace System.Linq{s=>{var d=DateTime.Parse(string.Join(" ",s.Split(' ').Skip(1).Take(4)));return d.ToString("h:mm ")+(d.Hour>11?"PM":"AM");}}

Version complète / formatée:

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<string, string> f = s =>
            {
                var d = DateTime.Parse(string.Join(" ", s.Split(' ').Skip(1).Take(4)));

                return d.ToString("h:mm ") + (d.Hour > 11 ? "PM" : "AM");
            };

            Console.WriteLine(f("Fri Jun 30 2017 21:14:20 GMT-0700 (PDT)"));
            Console.WriteLine(f("Fri Jun 30 2017 00:10:23 GMT-0700 (PDT)"));
            Console.WriteLine(f("Fri Jun 30 2017 12:10:23 GMT-0700 (PDT)"));
            Console.WriteLine(f("Fri Jul 01 2017 01:14:20 GMT-0700 (PDT)"));
            Console.WriteLine(f("Sat Apr 10 2020 09:06:20 GMT-0700 (PDT)"));

            Console.ReadLine();
        }
    }
}


0

MATL , 9 octets

5:24)16XO

Essayez-le sur MATL en ligne! Ou vérifiez tous les cas de test .

Explication

5:24    % Push array [5 6 ... 24]
)       % Implicit input. Get characters at those positions. This
        % removes the first four characters with the day of the week
16      % Push 16
XO      % Convert to date string format 16, which is 'HH:MM PM'
        % Implicitly display

Pouvons-nous avoir une explication?
2017 totalement humain

1
@totallyhuman Bien sûr, merci de me le rappeler. Édité. Fondamentalement, le builtin XOfait la plupart du travail
Luis Mendo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.