12 часовое преобразование времени

10

Вызов

Преобразуйте и распечатайте время в 12-часовом формате. HH:MM AM/PM

Примеры

Входные данные:

  • '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)'

Ouput:

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

Тонкие Очки

  • Ноль перед однозначным числом в порядке , ноль также не допускается. Следующие примеры оба разрешены :

    • 9:06 AM

    • 09:06 AM

  • Все проверенные годы будут после 999(каждый год будет точно 4 цифрой)

правила

zoecarver
источник
Предлагаемые тесты: 00:10:23 --> 12:10 AMи 12:10:23 --> 12:10 PM.
Арно
там мы идем. Не стесняйтесь редактировать, если вы видите что-нибудь еще, я должен изменить. спасибо за предложение!
zoecarver
Связанный
Не дерево
2
Можем ли мы считать, что время указано в часовом поясе, в котором выполняется программа? (например, 'Fri Jun 30 2017 21:14:20 GMT-0400 (EDT)'для меня)
ETHproductions
9
эм, 31 июня не существует. Это точно?
Эрик Лагергрен

Ответы:

7

JavaScript (ES6), 69 байт

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


JavaScript (ES6), 58 55 байт

Предполагается, что вы находитесь в Соединенных Штатах.

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


JavaScript (ES6), 81 78 байт

Ответ перед выводом ведущего 0 в однозначных часах был сделан необязательным, и были добавлены контрольные примеры без ведущих 0.

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

darrylyeo
источник
1
Я думал об изменении ${m>12?'P':'A'}Mна ${"AP"[m>12]}M, но это не работает без приведения индекса к целому числу (как с |0), что делает его такой же длины. Красиво в гольф.
kamoroso94
Вы можете опустить ,21в срез, чтобы сохранить 3 байта.
Рик Хичкок
Возвращает 12:10 утра для Fri Jun 30 2017 12:10:23 GMT-0700 (PDT). Должно быть в личку. Изменение m>12к m>11следует исправить.
Рик Хичкок
чтобы сэкономить 4 байта:d=>(new Date(d).toLocaleString(0,{hour:'numeric',minute:'numeric',hour12:1}))
zoecarver
Фактически, вы можете сэкономить 25 байтов с помощью следующего:d=>(new Date(d).toLocaleTimeString().replace(/:\d+/,''))
zoecarver
6

Python 2 , 66 байт

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

Попробуйте онлайн!

totallyhuman
источник
Это терпит неудачу в течение лет, которые имеют меньше чем 4 цифры (хотя я не уверен, должно ли это работать с теми).
notjagan
Я думаю, что все в порядке.
zoecarver
@ notjagan это не обязательно, так говорится в вопросе.
Федоне
@totallyhuman К сожалению, извините.
Федоне
Вы можете изменить int(s[15:18])>11на s[15:18]>"11"?
ETHproductions
5

sh + coreutils, 22 байта

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

(Если разрешены секунды, то date +%r -d"$1"достаточно.)

Андерс Касеорг
источник
впечатляюще мало байтов! также хорошо сделано
Zoecarver
4

JavaScript (ES6), 77 байт

Предполагается, что год состоит из 4 цифр.

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

Контрольные примеры

Arnauld
источник
Как и выше, я нашел меньший способ создать и ответить. Не стесняйтесь использовать мой код, я не думаю, что отвечать на мой собственный вопрос действительно стоит. d=>(new Date(d).toLocaleTimeString().replace(/:\d+/,''))
zoecarver
@pudility Это будет работать, только если у вас есть Locale en-USи ваш часовой пояс GMT-0700 (PDT). Например, ни одно из этих предположений не верно для меня.
Арно
1

V , 36 байт

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

Попробуйте онлайн!

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 байт

Ответ улучшился благодаря манату

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

Первая попытка:

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

Пример использования через php CLI:

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

Это моя первая попытка игры в гольф.

jankes
источник
Нет необходимости в переменной $dи таким образом вы не можете избавиться от явного echo: <?=(new DateTime($argv[1]))->format('h:i A');.
Манатворк
1

Желе , 43 байта

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

Попробуйте онлайн!

Это слишком долго ! То есть желе отстой во время манипуляции.

РЕДАКТИРОВАТЬ: я даже превзошел PHP!

Эрик Outgolfer
источник
0

C #, 145 байт

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

Полная / Отформатированная версия:

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();
        }
    }
}
TheLethalCoder
источник
0

MATL , 9 байт

5:24)16XO

Попробуйте это в MATL онлайн! Или проверьте все тестовые случаи .

объяснение

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
Луис Мендо
источник
Можем ли мы получить объяснение?
полностью человек
1
@totallyhuman Конечно, спасибо, что напомнили мне. Ред. В основном встроенная функция XOвыполняет большую часть работы
Луис Мендо