12 saat ila 24 saat arası zaman dönüştürücü


27

Şaşırtıcı bir şekilde, bu basit görev zaten görünmüyor, bu yüzden ...

Göreviniz 12 saatlik bir girdi alan ve bunu "askeri saate" veya 24 saatlik bir biçime dönüştüren bir program yazmak.

Giriş formunda olacaktır:

HH:MM am/pm

Hafif değişikliklere izin verilse de:

  • Öğleden sonra / öğleden sonrayı ayıran alan isteğe bağlıdır.

  • Son kısım "am" / "pm" veya "a" / "p" olabilir.

  • Büyük harf kullanımı iyi.

Çıktı girilen zaman olacak, 24 saat formatına dönüştürülecek. Bir sayı veya bir dize olabilir.

Hem giriş hem de çıkış için:

  • İlk etapta 0s isteğe bağlıdır. Son 3 yerde 0s zorunludur.

  • Saat ve dakikaları ayıran sınırlayıcı bir ":", "" (boşluk) veya hiçbir şey olmayabilir.

Diğer notlar:

  • Gece yarısı 0000 veya 2400 olarak ifade edilebilir.

  • Gece yarısı "am", öğlen "pm" olarak kabul edilir.

Programınız bir işlev veya tam bir program olabilir ve sonucu döndürmeli ya da stdout'a vermelidir. Sondaki boşluk boş.

Örnekler (her formatı desteklemeniz gerekmez):

12:00am -> 0000
1200 pm -> 1200
1234Am  -> 00:34
134a    -> 134
01:34PM -> 13 34
1234pm  -> 1234  

Bu kod golf, yani en küçük bayt sayısı kazanır. Bu, yerleşik bir çözümü çözmek için çok önemsiz olduğu için, bunu manuel olarak çözen bazı kodları görmek güzel olurdu (ancak yerleşiklerin kullanımı iyidir).

Sadece netleştirmek için değil her türlü biçimini desteklemek için gerekli. Yalnızca tek bir girişi ve tek bir çıktı formatını (seçiminize göre) desteklemek iyidir. Bununla birlikte, yukarıda belirtildiği gibi formatı sınırlamak istiyorum (bu zaten oldukça ücretsiz). {1134,'pm'}örneğin, kabul edilemez.


Hangi formatları desteklememiz gerekiyor? Bir tane mi?
redstarcoder

@ redstarcoder Evet. Yukarıdaki gereksinimlere uyan herhangi bir format tamamdır, ancak örnek vakalarda yukarıda belirtildiği gibi her formatı desteklemeniz gerekmez. Tek bir girdi formatı ve tek bir çıktı formatı iyi.
Carcigenicate

Bizim biçimleri için izin verilen gerektiren gelen sıfırları? Mesela 01:54pmişe yarar, ama 1:54pmolmaz mı?
FlipTack

Evet. Gerekli giriş formatını seçebilirsiniz.
Carcigenicate

Girdi ve çıktılarımıza saniyeler dahil etmemize izin verilir mi?
12Me21

Yanıtlar:


8

V , 21 17 bayt

4 byte için @DJMcMayhem!

í12:/0:
çp/12
$x

Çevrimiçi deneyin! Bu biçim alır ya olduğu ya formatta ve getiri bunuHH:MMxxapHH:MM

HexDump:

00000000: ed31 323a 2f30 3a0a e770 2f31 3201 2478  .12:/0:..p/12.$x
00000010: 0ae7 612f 2478                           ..a/$x

Açıklama:

í12:/0:   | find and replace 12: with 0: (to avoid replacing HH:12)
ç         | on every line
 p/       | that contains a p
   12^A   | increment 12 times (the first number, hours)
$x        | delete the character at the end of the line

Giriş her zaman [1-12]doğru olacak mı? Bu durumda, ó^12/0yerine yapabileceğini düşünüyorumcw^R=^R"%12
DJMcMayhem

1
Ayrıca, bir makroyu kırmaktan daha kısa olan bir regex ile eşleşen satırlara bir komut uygulamak için "global command" kullanabilirsiniz. çp/12^Aeşdeğerdir hangi :g/p/norm 12<C-a>vim
DJMcMayhem

Bunu kabul ettim, çünkü bir yerleşik kullanmayacağını açıkça gösteren en düşük puanlama cevabıydı (kullanmalarını yasaklamamama rağmen). Herhangi birinin bu seçimde bir sorunu varsa, cevabımı adil olacak şekilde değiştirebilirim. Bence bu cevap en hakettiği gibi.
Carcigenicate


10

Octave, 21 17 bayt

Luis Mendo sayesinde 4 byte kurtarıldı. Bunun yerine 15 biçim biçimini belirtebilirim 'HHMM'.

@(c)datestr(c,15)

Açıklama:

Bu, formata girdi olarak bir dize alan adsız bir işlevdir . formatı otomatik olarak standart tarih formatlarından biri olarak tanır ve bunu belirtilen 15 numaralı formatta çıkarır .c'11:34 AM'datestrHH:MM

Belirtilen çıkış formatı olmadığından AMveya PMOctave otomatik olarak Askeri zaman olarak adlandırdığınız şeye dönüştürmez.

Çevrimiçi deneyin.


datestr35 bayt kullanmayan bir sürüm

@(c)[c(1:4)+[1,2,0,0]*(c(5)>97),'']

Açıklama:

Biçimde bir giriş dizesi calır 1134am.

@(c)                              % Anonymous function
[c(1:4)                           % First 4 elements of the string
       +[1,2,0,0]                 % Add 1 and 2 to the first to the ASCII-value of the 
                                    first two characters
                 *)c(5)>97)       % if the fifth element is larger than 97 
                                    (the ASCII code for `a`).
                            ,'']  % Implicitly convert to string

Veya, 37 bayt için farklı bir yaklaşım:

@(c)[c(1:4)+('1200'-48)*(c(5)>97),'']

7

PowerShell , 23 20 19 bayt

date "$args"-f HHmm

Çevrimiçi deneyin!

(Windows'taysanız, get-19 bayta kadar olanı atlayabilirsiniz . TIO'da görünüşe göre tam Get-Dateadı gerektirir .)

Girdiyi dize $args[0]olarak alır Get-Date, onu bir .NET datetimenesnesine ayrıştıran cmdlet'in girişi olarak kullanır . Bu, onu askeri saate dönüştürmek için kullanılan -format parametresiyle geçti HHmm(sermaye HH24 saatlik süreyi belirtir). Çıktı kapalı.

Ayrıştırma motoru oldukça sağlamdır, bu nedenle ek 12amveya benzeri girişlere 12:00amizin verilir. TIO'da giriş yaparak oynayın ve başka nelerin işe yaradığını görün.

( @Admalledd sayesinde 3 bayt kaydedildi ... @briantist sayesinde başka bir bayt kaydedildi )


Arasındaki boşluğu kaldırmak mümkün olmalıdır $args[0]ve -fsıra formatında str tek tırnak kaldırdıkça,: date $args[0]-f HHmm. En azından bu benim powershell üzerinde çalışıyor ...
admalledd

@ admalledd Yüksek sesle ağlamak için her zaman bu teklifleri unutuyorum. Ciddi, ben kullandım her zaman düşünüyorum Get-Dateile -f, birisi tırnak gerekmez hatırlattı etti. Ayrıştırıcı ]bir jetonun sonu gibi davrandığından, alanın kaldırılması için de iyi çağrı . Teşekkürler!
AdmBorkBork

5

Python 2,44 bayt

lambda s:`int(s[:2])%12+12*("p"in s)`+s[3:5]

Giriş formatı:, 01:23amisteğe bağlı mve dakikalar sonra boşluklar
Çıkış formatı:123


5

Pyth, 21 20 bayt

Aczd++*12}\pH%sG12PH

Formun girişini 01 23a"01:23 am" olarak alır. İlk 0 isteğe bağlıdır.
Çıktı, 123ilk 0 atlanmış halde formda .

Sözde kodda:

                         z = input()
A                        G, H =
 czd                         z.split(" ")       # splits into the form ["1","23p"]
                         (
     +*12}\pH            12*('p' in H) +        # add 12 if 'p' is in the string
             %sG12         int(G) % 12
    +             PH     ) + H[:-1]             # prepend hour to minutes, with a/p removed

Çevrimiçi deneyin!


4

PHP, 35 32 bayt

giriş formatı: büyük / küçük harf duyarlı, iki nokta üst üste ve mçıkış formatı gerektirir hhmm. yerleşikleri kullanır:

<?=date(Hi,strtotime($argv[1]));

ilk komut satırı argümanından girdi alır.

PHP, 45 bayt, yerleşik değil

giriş biçimi (h)h:mm a(m)küçük harf, çıktı biçimi (h)hmm.

<?=($s=$argv[1])%12+12*($s[6]>a).$s[3].$s[4];

4
Neden aşağı oy?
Titus

Ben sadece spekülasyon yapıyorum ama belki de PHP kullandığınızdan ve indirme yapan kişi PHP'den hoşlanmadığı için mi? : p
bash0r

3

JavaScript (ES6), 40 bayt

a=>(new Date('1/1/1/'+a)+a).slice(16,21)

Giriş şu şekilde biçimlendirilmelidir: 12:32 am


3

GNU Coreutils ( 18 16 bayt)

Bir kabuk betiğinden:

Girişte boşluk kabul etmiyor

Bu noktada, $ 1 kullanabilir ve ek argümanlar yoksayılabilir.

date -d$1 +%H%M

⇒ echo 'date -d$1 +%H%M' > time24
⇒ sh time24 1:45pm
1345
⇒ sh time24 1:45 pm
0145 # Wrong answer, “pm” ignored because of space

orijinal

Girişte boşluk olmasına izin vermek için,

date -d"$@" +%H%M

3

C #, 46 bayt

s=>System.DateTime.Parse(s).ToString("HH:mm");

Dizeler gibi girişlerde alınır. 12:00 AM

Aynı şeyi yapmak, ancak varsayılan çağrıdan ToString(kültürü varsayarak en-GB) çıktının üzerine basmak, 49 bayt için 3 bayttır:

s=>(System.DateTime.Parse(s)+"").Substring(11,5);

3

date, 0 + 8 = 8 bayt

İşe uygun aracı kullanma konusunda…

Komut satırı argümanı olarak girdi alır. +%H%M -d(8 byte ceza) ile çalıştırın . Burada gerçek bir program yok; tüm çalışma, komut satırı argümanları tarafından yapılır. (Bu neden oldukça iyi bir gösteri komut satırı argümanlarına bir ceza !)

Örnek:

$ date +%H%M -d "12:05 am"
0005

3

Java 7, 138 106 105 104 bayt

String a(String a){return new java.text.SimpleDateFormat("Hmm").format(new java.util.Date("Ja1,0,"+a));}

Çevrimiçi deneyin!

Girdi sütunla sınırlandırılmıştır ve saat ile öğleden sonra / pm arasında bir boşluk vardır. Çıktı kolonla sınırlı değil.

Kevin Cruijssen sayesinde -1 bayt


Java için aldığı kadar kısa sürede paketleyin, kodun% 20'si paket niteliği taşıyor.
Magic Octopus Urn

"Kurallar bu devlet .: - ilk etapta 0sn isteğe bağlıdır son 3 yerde 0sn zorunludur giriş ve çıkış her ikisi için de. ", Değiştirmek hangi araçlar HHmmiçin Hmm.
Kevin Cruijssen

@KevinCruijssen güzel yakalamak!
Poke

2

Japt , 14 bayt

Ð"1/"+U s sG21

Çevrimiçi deneyin!

Bu yalnızca Chrome'da çalışır. İşte tüm tarayıcılarda çalışan bir sürüm:

Ð"1/"³+U s sG21

Yardım için ETHproductions'e tekrar teşekkürler!


2

Perl, 45 28 37 bayt

28 37 bayt

(c / o @Dada)

(36 bayt kodu, derleyici için 1 bayt -p anahtarı )

0145pmAm / pm veya a / p ile yazılan biçimleri kabul eder . Gerekli girişlerde lider sıfırlar.

s/(..)(.)$//;$_=$_%12+12*(p eq$2).$1

Ölçek:

⇒ echo 0145pm | perl -p time24
1345
⇒ echo 0245pm | perl -p time24
1445
⇒ echo 1245pm | perl -p time24
1245
⇒ echo 1245am | perl -p time24
045

Orijinal cevabım

(ayrıca yavaşça revize edildi)

(39 bayt kodu, derleyici -panahtarı için 1 bayt .)

Yalnızca 0145p veya 0145a gibi bir formu kabul eder ve başka hiçbir şey kabul etmez ve perl -pçalışması için mod gerekir.

s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e

Ölçek:

⇒ echo 0145p | perl -p time24
1345
⇒ echo 1222a | perl -p time24
022
⇒ echo 1234p | perl -p time24
1234

PPCG'ye hoş geldiniz. Güzel ilk cevap. Anahtarları kullanabilirsiniz, ancak bytecount'unuzda sayılırlar ( burada açıklandığı gibi ). Sizin durumunuzda, -pçift ​​tırnak için tek tırnak işareti değiştirirseniz , bu +1 bayt olur (çünkü yalnızca gerekli).
Dada

Teşekkürler. Bu SSS'yi bulamadınız mı, Stack Exchange ekibinin cevap sayfasında mı yoksa bir şeyde mi tespit edebileceğini merak ettiniz mi?
BRPocock

Tamam, 4 seriden beri Perling'im ve bu da başımın ağrımasına neden oluyor , krediyi almalı ve kendinle göndermelisin. ☺
BRPocock

Bence bu şimdi kapsamalı mı?
BRPocock

Bir hata yaptım, dakika 0 ile 9 arasındayken bu çözüm işe yaramaz. Bu kod daha sonra çalışır: s/(..)(.)$//;$_=$_%12+12*(p eq$2).$1(37 bayt). Ve bu arada, ilk çözümünüz biraz daha golf oynayabilir: s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e(40 byte)
Dada

2

Commodore 64 BASIC, çalıştırmadan önce 301 bayt, bir kez çalıştırıldığında kullanılan 321 bayt

0 A$="12:34AM":A=VAL(LEFT$(A$,2)+MID$(A$,4,2)):ON-(RIGHT$(A$,2)="AM")+1GOSUB1,2:TI$=A$:PRINTTI$:END
1 ON-(A=>1200ANDA<=1259)GOTO3:A=A+1200:GOTO3
2 ON-(A=>1200ANDA<=1259)GOTO4:ON-(A<=959)GOTO7:RETURN
3 A$=RIGHT$(STR$(A)+"00",6):RETURN
4 A=A-1200:IFA=0THENA$="000000":RETURN
5 IFA<10THENA$="000"+RIGHT$(STR$(A),1)+"00":RETURN
6 A$="00"+RIGHT$(STR$(A),2)+"00":RETURN
7 A$="0"+RIGHT$(STR$(A),3)+"00":RETURN

Bunu gerçek bir Commodore 64'e girmek için LEFT$, LE için [shift] F , M [shift] I gibi BASIC anahtar kelime kısaltmalarını kullanmanız gerekir.MID$ … veya CBM PRG STUDIO'yu deneyebilirsiniz.

TI$Basılı olduğunda Commodore BASIC değişken SSDDSS olarak 24 saatlik biçimde zaman sunulur. Satır numarasından sonra boşluğu almak Commodore BASIC, programı girdikten sonra listelediğiniz zaman boşluğa otomatik olarak eklediğinden hiçbir hafızayı kaydetmez.

Bir sayıyı bir dizgiye dönüştürürken STR$, Commodore BASIC boşluğa katar (eğer PRINT Asayı gösterilmeden önce bir boşluk görecekseniz), numaradaki açılış alanını RIGHT$komutla dize dönüştürmeye kaldırdım . Sıfır satırını değiştirerek birkaç bayttan tasarruf edebilirsiniz:

0 A=VAL(LEFT$(A$,2)+MID$(A$,4,2)):ON-(RIGHT$(A$,2)="AM")+1GOSUB1,2:TI$=A$:PRINTTI$:END

bu nedenle, programı çalıştırmadan önce dönüştürmek üzere zamanınızı aşağıdaki gibi bildirmeniz gerekecektir:

A$="01:22AM":GOTO 0

Ondan sonra herhangi bir anda, şu anki saati ile görebilirsiniz:

? TI$

8-bit makinelerde kod golf oynamak, günümüz programcıları için düşünmeye bile gerek kalmadan ne kadar iş yapıldığını gösterdiği için gerçekten ilginçtir.
Shaun Bebbers

2

Java, 171 bayt

enum t{;public static void main(String[] a){a=a[0].split("[: ]");System.out.format("%02d%02d",(Long.parseLong(a[0])+(a[2].charAt(0)=='p'?12:0))%24,Long.parseLong(a[1]));}}

Giriş formatı HH:MM a/pve çıkış formatıdır HHMM. Ana işlevin, girişi 3 bölüme ayırmak için bir dizi dizeye sahip olduğu iddiası: saat, dakika ve a / p göstergesi.

Örnek giriş ve çıkış:

Input: 01:02 a
Output: 0102

Input: 01:02 p
Output: 13:02

Input: 12:22 p
Output: 0022

Ungolfed versiyonu:

enum t {
    ;

    public static void main(String[] a) {
        a = a[0].split("[: ]");
        System.out.format("%02d%02d", (Long.parseLong(a[0]) + (a[2].charAt(0) == 'p' ? 12 : 0)) % 24, Long.parseLong(a[1]));
    }
}

Bunu enumtutabildiğimi görmedim main. Güzel :)
Robert Benson,

Ana yöntem imzasında boşluk bırakabilirsiniz: public static void main (Dize [] a) {...
staticmethod

2

REXX, 33 bayt

arg h':'m a
say h+((a=pm)*12)':'m

kullanın:

12:34 pm -> 24:34
1:34 pm -> 13:34
1:34 am -> 1:34
0:34 AM -> 0:34

Sınırlayıcı olarak bir kolon kullanılmamışsa, bu birkaç byte ile kısaltılabilir.


Kolon sınırlayıcı isteğe bağlıdır.
Carcigenicate

Evet, ama iyi görünmüyor.
09:03

Bunun bir kod-golf mücadelesi olduğu göz önüne alındığında, güzel çıktıya sahip daha uzun bir program seçeneğine veya çirkin çıktıya sahip daha kısa bir program seçeneğine sahipseniz, ikincisini seçin. Kimse seni yargılamayacak.
Carcigenicate

2

C (clang) , 94 bayt

h,m;f(){char a,b;scanf("%d:%d%c%c",&h,&m,&a,&b);printf("%02d%02d",a=='a'?(h%12):(12+h%12),m);}

Çevrimiçi deneyin!

Öğrenmek için buradayım, bu yüzden kodu nasıl optimize edebileceğim ile ilgili herhangi bir ipucu bekliyoruz.

@ Johan du Toit Birkaç byte'ı kurtardığınız için teşekkürler!


B == 'm' olup olmadığını test etmek zorunda değilsiniz ve ifadeler varsa satır içi kullanarak çok daha kısa hale getirebilirsiniz:printf("%02d:%02d", (a=='p' ? 12 : 0) + (h %12), m);
Johan du Toit

1
@ JohanduToit Girdi 6: 00pc nedir? :)
Abel Tom

1
Bu, uzay-zaman sürekliliğinde onarılamaz bir hasara neden olacaktır.
Johan du Toit


2

C, 87 72 bayt

@Johan du Toit sayesinde 15 bayt kurtarıldı

f()Değişken bir dizge ile argüman olarak çağrı yapın , girdi çıktıdır.

Biçimi HH:MMa/pburada, a/pküçük ya da bir aya da küçük p. Zamanla meridyen tanımlayıcısı arasında boşluk kalmaz.

i;f(char*p){i=atoi(p)%12+(p[5]^97?12:0);*p=i/10+48;p[1]=i%10+48;p[5]=0;}

İdeone üzerinde deneyin .


aşağıdakileri kullanarak birkaç bayttan tasarruf edebilirsiniz:i;f(char*p){i=atoi(p)%12+(p[5]^97?12:0);*p=i/10+48;p[1]=i%10+48;p[5]=0;}
Johan du Toit

Öner (p[5]!=97)*12;yerine(p[5]^97?12:0);
ceilingcat


2

SmileBASIC, 67 bayt

INPUT T$P=POP(T$)>"a
TMREAD"00:"+T$OUT,H,M?H MOD 12+12*P,T$[3];T$[4]

Giriş: HH:MMa/p

Çıktı: HH MM


1

R, 68 bayt

x=substr(strptime(scan(,""),"%I:%M %p"),12,16);`if`(x=="","00:00",x)

Stdin'den girdi okur ve aşağıdaki formatlardan birinde olduğu varsayılır:

  • 12:00 AM
  • 12:00 am
  • 12:00AM
  • 12:00am

ve çıktı şu şekildedir: [1] "00:00"

Çoğu durumda strptime()çıktı, formatta: "2017-01-06 12:00:00 CET"tarihin yerel tarih olduğu yer. Bu nedenle substr(), sadece zamanı geri döndürmek için kullanmamız gerekir , ancak, eğer giriş gece yarısı ise (örn. 12:00am) Çıktı sadece sondaki şeyin "2017-01-06 CET"sebebidir if(daha akıllıca bir geçici çözüm olmalıdır).


I really wanted to find a shorter way with lubridate, but the name of the package is too long (among other problems).
BLT

1

C, 159 152 bytes

#define C c[0]
main(i,c)char**c;{scanf("%s",C);i=atoi(C);if(C[5]-97){i+=i-12?12:0;sprintf(C,"%d",i);}else if(i==12)C[0]=C[1]=48;C[2]=58;C[5]=0;puts(C);}

Input format: 07:30am



1

Mathematica, 33 bytes

#~DateString~{"Hour24","Minute"}&

Anonymous function. Takes a string as input and returns a string as output. Works with most formats, including hh:mm AM/PM.


1

JavaScript, 67 bytes

f=s=>!~s.indexOf`pm`?s.slice(0,5):((+s.slice(0,2)+12)+s.slice(2,5))

Input is like in the example


Does not work for 12:00 am or 12:00 pm
Herman L

1

Haskell, 61 characters

Short version:

c[a,b,c,d,e]=(mod(read[a,b]::Int)12+f e,[c,d])
f 'a'=0
f _=12

Input format: HHMM(a/p) where (a/p) is either 'a' or 'p' without parenthesis.

Output format: (hs, MM) – a tuple containing the hours as an integer and MM still as string.

Example:

> c "1200p"
(12,"00")
> c "1200a"
(0,"00")

Longer version (with more useful names and one substitution hs):

conv [h0,h1,m0,m1,ap] = (mod hs 12 + offset ap, [m0,m1])
    where hs = read [h0,h1] :: Int

offset 'a'=  0
offset  _ = 12

1

Common Lisp (151122 bytes)

OK, CL isn't meant to be “terse” but I'm just surprised that it isn't the most verbose for this one.

Here's the 122 byte version, which requires fixed-position input. 0145pm or 145p are acceptable (with the leading space in the first character-position).

(defun a(x)(let((h(parse-integer(subseq x 0 2)))(m(subseq x 2 4)))(format nil "~a~a" (+(mod h 12)(if(find #\p x)12 0))m)))

PPRINT:

(DEFUN A (X)
  (LET ((H (PARSE-INTEGER (SUBSEQ X 0 2)))
        (M (SUBSEQ X 2 4)))
    (FORMAT NIL
            "~a~a"
            (+ (MOD H 12) (IF (FIND #\p X) 12 0))
            M)))

Nicer but bigger

Using only the Common-Lisp package. Accepts (only) input in the form of integer hours (with or without leading 0), literal :, two-digit minutes, and optional trailing am or pm (in lower-case only). Permits whitespace around the time and around the AM/PM, but not directly after the :.

(defun a(x)(let*((c(position #\: x))(h(parse-integer(subseq x 0 c)))(m(subseq x(1+ c)(+ 3 c))))(format nil "~a~a" (+(mod h 12)(if(find #\p x)12 0))m)))

Test:

GOLF> (a "  1:45 am ")
"1:45"
GOLF> (a "  1:45 pm ")
"13:45"
GOLF> (a " 12:45 am ")
"0:45"
GOLF> (a "12:45p")
"12:45"

pprint the function definition:

(DEFUN A (X)
  (LET* ((C (POSITION #\: X))
         (H (PARSE-INTEGER (SUBSEQ X 0 C)))
         (M (SUBSEQ X (1+ C) (+ 3 C))))
    (FORMAT NIL "~a~a"
            (+ (MOD H 12)
               (IF (FIND #\p X)
                   12
                   0))
            M)))

De-obfuscated:

(defun 12->24-hour (timestring) 
  "Given a  TIMESTRING with  hours:minutes and a  trailing “am”  or “pm”
   \(lowercase-only), return the 24-hour time without a delimiter as
   a  string \(eg,  \"1:45am\" →  \"0145\"). Spaces  surrounding the
   time or  meridian markers are ignored  \(eg, \" 02:22 pm  \") but
   other junk in the string may cause incorrect behavior."
  (let ((colon (position #\: timestring)))
    (let ((hours (parse-integer (subseq timestring 0 colon)))
          (minutes (subseq timestring (+ 1 colon) (+ 3 colon))))
      (format nil "~a~a"
              (+ (mod hours 12) (if (find #\p timestring) 12 0))
              minutes))))

1

Retina, 61 60 bytes

^12(.*)a
00$1
^(12.*)p
$1
a

(\d\d)(.*)p
$1$*x12$*x$2
x+
$.&

Input is given without a separating colon, mandatory leading 0, and using only a or p instead of am or pm, eg 0134a is 01:34 am. Outputs in straight military time using 0000 as midnight. (I could save some bytes if I'm allowed to convert, for example, 12:30 am into 2430, but I doubt that's acceptable).

Try it online!

Explanation

The initial two cases deal with the "12" hours, since am/pm is reversed for 12:

^12(.*)a
00$1

If the time is between midnight (12 am) and 1 am, change it to 00 instead of 12, and remove the a.

^(12.*)p
$1

If the time is between noon (12 pm) and 1pm, remove the p to simply get the 24 hour time.

For any other hour:

a
 

If the time is am, simply remove the a to get the 24 hour time.

(\d\d)(.*)p
$1$*x12$*x$2
x+
$.&

If the time is pm, remove the p. Convert the hour component to unary, add 12, and convert back to decimal. Leave the minutes unchanged.


1

Batch, 40 bytes

@set/aa=0,p=12,h=%1%%12+%3
@echo %h% %2

Takes input as three arguments. Assumes second argument has leading zero where necessary, third argument is either a or p. Works by treating the third argument as an indirect variable name therefore adding it on to the number of hours; the number of minutes is unaffected so is just output directly. If mixing different formats is OK then the last space can be deleted to save a byte.

(Rather annoyingly, this question didn't appear on the questions page when I originally loaded it, and I only stumbled across it because I was searching for another question.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.