# It's time for a clock challenge!

I'd like you to build me a clock that displays time in this format:

18 ----------
19 --------------------------------------------------


This displays '18:10'. The current hour and the next hour are shown at the front of the line, followed by a space and a number of dashes: on the first line the number of minutes that have passed in this hour, and the second line shows how many more minutes to go in this hour.

# To clarify

• The clock should display the system's time. If fetching the time from another source is more convenient, that's fine too. It may not be supplied as input.
• At 18:00, the top line is just 18 (Trailing spaces allowed but not required)
• At 18:59, the bottom line is 19 -
• The hours < 10 are either pre-padded with a 0 (01 -----) or right-aligned ( 1 -----). A left-aligned single digit is not allowed, not even if the dashes start at the right place (1 ----- is invalid).
• The clock should display the hours in a 24h-format.
• Although it's called the 24h format, there is not actually a 24 on it. During the 23rd hour, the second line starts with 00 or  0.
• The display needs to be updated at least once a minute, but that doesn't have to happen at exactly 00 seconds. You may update more frequently / continuously if that is more convenient, but the result must of course still be legible - not one smear all over the screen.

None.

# Output

• As described above. Trailing spaces to pad the clock to 60-ish positions is allowed on both lines, a trailing newline is also allowed.
• The screen needs to be cleared when displaying the next minute: either with a clear-screen command or by adding no less than 30 newlines.

• may we have two spaces between the number and the dashes? – Adám Jan 17 '17 at 16:48
• "updated once a minute" -- Can it be updated more often? – smls Jan 17 '17 at 16:49
• @smls Yes, you may update as often as you like. I'll change the specs to 'at least once a minute'. – steenbergh Jan 17 '17 at 17:52
• @KritixiLithos That would break alignment with two-digit hours (9, 10 or 23, 00), so no, not allowed. – steenbergh Jan 17 '17 at 19:04
• After 23, is the next hour 24 or 0? – Cows quack Jan 18 '17 at 15:43

# MATL, 41 bytes

Thanks to @Kundor for noticing a mistake, now corrected

XxFT"4&Z'@+24\OH&YAO'-'60@*5&Z'-|Y"hhD]T


Try it at MATL online! But note that the program is killed after 30 seconds, so it's difficult to catch any changes in the output.

### How it works

           % Do...while
Xx        %   Clear screen
FT        %   Push [0 1]
"         %   For each k in [0 1]
4&Z'    %     Push current hour
@+      %     Add k
24\     %     Modulo 24. This transforms 24 into 0
OH&YA   %     Convert to base-10 string with 2 digits
O       %     Push 0. Concatenating with chars will convert this to char,
%     and char(0) will be displayed as a space
'-'     %     Push '-'
60@*    %     Push 60*k
5&Z'    %     Push current minute
-|      %     Absolute difference. This gives current minute for k==0,
%     or 60 minus that for k==1
Y"      %     Repeat '-' that many times
hh      %     Concatenate the top three elements into a string
D      %      Display
]         %   End
T         %   Push true
% End (implicit). Since the top of the stack contains true, this
% gives an infinite loop

• Could be me, but at the second iteration, only the top line is printed... – steenbergh Jan 17 '17 at 17:28
• @steenbergh It works for me with minutes and seconds instead of hours and minutes, so the changes are easily seen: matl.suever.net/… – Luis Mendo Jan 17 '17 at 17:56
• Yep, works. - in fact, might be cool to have this as lines 3 and 4 of my own clock. – steenbergh Jan 17 '17 at 18:01
• @steenbergh: you accepted this answer, but it's not valid—it shows the hour after 23 as 24. I believe the shortest correct answer is the Ruby one by Value Ink. – kundor Jan 22 '17 at 23:06
• @kundor Thanks for noticing. Corrected at the cost of 3 bytes – Luis Mendo Jan 23 '17 at 0:31

# tcl, 164

while 1 {scan [clock f [clock se] -f %T] %d:%d h m
puts "[format %2s $h] [string repe -$m]\n[format %2s [expr ($h+1)%24]] [string repe - [expr 60-$m]]"
after 9999}


demo

• This code can be golfed quite a bit. [This](goo.gl/zU9n2W ) is only 165 bytes. Also, it doesn't clear the screen (or add 30 newlines) between frames. – steenbergh Jan 24 '17 at 6:33
• @steenbergh When I execute the code of your link I get errors. – sergiol Feb 4 '17 at 16:06
• Oh, now I see what happened. That environment just kept running your original code instead of running my modifications. Sorry about that... – steenbergh Feb 4 '17 at 18:50

## Guile, 146, 143 bytes

(while(sleep 9)(let*((t(gmtime(current-time)))(h(tm:hour t))(m(tm:min t)))(format #t "~d ~v,,'-t~%~d ~v,,'-t~%" h m(modulo(1+ h)24)(- 60 m))))


Shaved off three bytes thanks to ceilingcat.

## Bash + Coreutils, 114 bytes

while sleep 9; do date +'%k %_M'|{ read h m;printf %02d:%${m}s\n$((h+1)):%$((60-m))s\n"$h|tr " :"  "- "; }; done


# PHP, 104 105 bytes

<? for(;;sleep(6))printf("%'
99s%2d %'-".($m=date(i))."s %2d %'-".(60-$m).s,"",$h=date(H),"",++$h%24,"");


showcase for printf´s custom padding characters:
"%'-Ns"=left pad string with - to N characters.

will print 99 newlines (every 6 seconds) instead of clearing the screen.

First newline must be a single character. So, on Windows, it must be replaced with \n.

## C#, 192185176172 169 bytes

Saved 3 bytes thanks to @nurchi

# BASH, 165141 155 bytes

while :
do
clear
m=date +%-M
a=printf %${m}s b=printf %$((60-m))s
h=date +%H
echo $h${a// /-}
printf "%02d %s" $((10#$h+1)) ${b// /-} sleep 9 done  • I could save another 8 bytes removing the sleep, but I'm not comfortable with an indefinite while loop running on my computer without a sleep ;-) – pLumo Jan 17 '17 at 21:46 • Some optimizations: move sleep 9 to the condition of the while loop; remove the - in front of M in the format string on line 4. You also don't need to use$ in front of variable names in arithmetic expressions, so $((60-$m)) can be $((60-m)) – Evan Krall Jan 19 '17 at 0:52 • I'm not sure whether your math on line 9 is accurate: h=23; echo$((10#$h+1)) prints 24 for me. – Evan Krall Jan 19 '17 at 0:52 • Whats wrong with 24? – pLumo Jan 19 '17 at 6:34 • I need the -M because$((60-08)) gives an error. – pLumo Jan 19 '17 at 6:35

## C, 176162161160 156 bytes

This is a gross abuse of pointers but compiles and runs as specified. Be sure to compile without optimization otherwise you are likely to hit a segfault.

main(){int*localtime(),b[9],*t;memset(b,45,60);for(;;)time(&t),t=localtime(&t),usleep(printf("\e[2J%.2d %.*s\n%.2d %.*s\n",t[2],t[1],b,t[2]+1,60-t[1],b));}


### Ungolfed:

#import<time.h>
main()
{
int *t,b[60];
memset(b,45,60);
for(;;) {
time(&t);
t=localtime(&t);
usleep(printf("\e[2J%.2d %.*s\n%.2d %.*s\n",t[2],t[1],b,t[2]+1,60-t[1],b));
}
}


## C 251267 251 bytes

 #include<time.h>f(){time_t t;struct tm *t1;h,m,i;while(1){time(&t);t1=localtime(&t);h=t1->tm_hour;m=t1->tm_min;printf("%d ",h);for(i=1;i<=m;i++)printf("-");puts("");printf("%d ",h+1);for(i=0;i<=59-m;i++)printf("-");puts("");sleep(1);system("clear");}}


Ungolfed version

#include<time.h>
void f()
{
time_t t;
struct tm *t1;
int h,m,i;

while(1)
{
time(&t);
t1=localtime(&t);
h=t1->tm_hour;
m=t1->tm_min;

printf("%d ",h);
for(i=1;i<=m;i++)
printf("-");

puts("");
printf("%d ",h+1);

for(i=0;i<=59-m;i++)
printf("-");

puts("");

sleep(1);
system("clear");
}
}


Gets the work done! Can definitely be shortened in some way. Assume unistd.h file is included.

@Neil Thanks for the info.

@Seth Thanks, for saving 8 bytes.

• IIRC you have to include everything necessary to get the code to compile (in this case, the definitions of time_t and struct tm) in your byte count. – Neil Jan 17 '17 at 21:33
• Instead of printf("\n"); you can use puts(""); – Seth Jan 19 '17 at 4:04

# Bash (3 and 4): 90 bytes

d=(sed s/./-/g<$0);let date +h=%H,m=%M;echo$h ${d:0:m}' '$[++h%24] ${d:m} sleep 5$0


Due to the use of $0, this script must be put into a file, not pasted into an interactive bash shell. The first command sets $d to 60 hyphens; it relies on the fact that the first line of this script is 60 characters long. This is three characters shorter than the next best thing I could come up with:

d=printf %060d|tr 0 -


If you don't want this to run your box out of PIDs or memory eventually, you can add eval to the beginning of the last line, which would make this 95 bytes.

• Gives me the error let: h=09: value too great for base (error token is "09"). Problem is that leading zeros are interpreted as octal constants, so 09 is invalid. – kundor Jan 20 '17 at 16:26
• Hrm, that means my script is broken in several ways. Thanks. – Evan Krall Jan 26 '17 at 18:03

# PHP, 112 120 bytes

for(;;sleep(9))echo($s=str_pad)($h=date(H),99,"\n",0).$s(" ",1+$m=date(i),"-")."\n".$s(++$h%24,2,0,0).$s(" ",61-$m,"-");


As there's no way to clear the screen (that I can find) I had to go with a pile of newlines. Also the question being updated to "at least" once a minute saves a byte with 9 instead of 60.

edit: @Titus noticed a bug in the padding of the second hour. Fixing it cost 8 bytes.

• This displays warning text on stdout along with the correct output: Notice: Use of undefined constant str_pad - assumed 'str_pad' in C:\wamp64\www\my-site\a.php on line 2 - Notice: Use of undefined constant H - assumed 'H' in C:\wamp64\www\my-site\a.php on line 2 - Notice: Use of undefined constant i - assumed 'i' in C:\wamp64\www\my-site\a.php on line 2. Anything on Meta about that? – steenbergh Jan 17 '17 at 18:46
• @steenbergh That´s a notice; it will not be displayed if you use default values (command line parameter -n or error_reporting(22519); – Titus Jan 17 '17 at 19:39
• hours must be padded to length 2 – Titus Jan 17 '17 at 20:27
• Good point, the H setting for date goes from 00-23, but I forgot about it for the second hour. – user59178 Jan 18 '17 at 15:51
• Save two bytes with physical linebreaks. – Titus Feb 2 '17 at 3:08

# Processing, 204200198 197 bytes

5 bytes saved thanks to @L. Serné by using smarter ternaries

void draw(){int i;String s=((i=hour())>9?i:" "+i)+" ";for(i=0;i<minute();i++)s+="-";s+="\n"+((i=hour()+1)>9?i>23?" 0":i:" "+i)+" ";for(i=0;i<60-minute();i++)s+="-";print(s);for(;i++<99;)println();}


This outputs 30+ newlines for each update (which takes place when the frame gets updated)

### Ungolfed

void draw(){
int i;
String s=((i=hour())>9?i:" "+i)+" ";
for(i=0;i<minute();i++)
s+="-";
s+="\n"+((i=hour()+1)>9?i>23?" 0":i:" "+i)+" ";
for(i=0;i<60-minute();i++)
s+="-";print(s);
for(;i++<99;)
println();
}

• Changing ((i=hour())<10?" ":"")+i into ((i=hour())>9?i:" "+i) would save 2B twice... Good luck with further golfing! – Luke Jan 17 '17 at 20:14
• @L.Serne thanks for the tip :) – Cows quack Jan 17 '17 at 20:30
• Another improvement that might work: ((i=hour()+1)>24?i=0:i)>9 becomes (i=hour()+1)>9, since hour outputs a number in the range 0-23, and even with 1 added to that, it'll never be greater than 24. Also, you should move the increment of i inside the condition in the for loop like you did in the very last loop. Should save 13B in total. – Luke Jan 17 '17 at 22:57
• @L.Serné For the first point, I still have to include the ternary because 23+1 in a 24-hour clock becomes 0 (or at least I think). Next, if I move the increment of i inside the condition of the for-loop, i will start as 1 instead of 0 and I need to add one more byte i++<=minute() and the bytecount will still be the same. But nonetheless, thanks for helping me golf 1 more bytes :) – Cows quack Jan 18 '17 at 15:48

## Python 2, 131129 127 bytes

from time import*
while[sleep(9)]:exec(strftime("a='%H';b=int('%M')"));print "\n"*30+a+" "+"-"*b+"\n"+int(a)+1+" "+"-"*(60-b)


saved a byte thanks to @TuukkaX

• You don't need the newline and space after the while 1: – Sriotchilism O'Zaic Jan 17 '17 at 19:02
• I started your code @19:55. At 20:01, I see 19 - \n 20 -----------------------------------------------------------. The hours aren't updating... – steenbergh Jan 17 '17 at 19:02
• @steenbergh I tried it myself by setting the clock manually and it works for me. – ovs Jan 17 '17 at 19:07
• @ovs aren't clock challenges fun :-). Anyway, probably something with repl.it then... – steenbergh Jan 17 '17 at 19:09
• head-desk The Repl.it server is one hour behind to my local time... And it even says so at the very top of the console. I'll see myself out, thanks... – steenbergh Jan 17 '17 at 19:14

## C# Interactive (138 Bytes)

while(true){var d=DateTime.Now;Console.WriteLine("{d.Hour:00} {new string('-',d.Minute)}\n{d.Hour+1:00} {new string('-',60-d.Minute)}");}  • Can you golf this down by 1) naming the date var d instead of dt? and 2) use sleep(1e3) or 999 instead of 1000? – steenbergh Jan 18 '17 at 14:10 • @steenbergh see update – series0ne Jan 18 '17 at 14:13 • A few things... This is just a snippet not a method or program (not sure if it's valid in C# Interactive though), it is essentially a golfed version of my code, and if it is should have been commented as improvements not a separate solution (though this is speculation) and there are lots of small improvements you can make here, and do you even need the sleep? – TheLethalCoder Jan 18 '17 at 14:15 • @TheLethalCoder I specifically put C# Interactive because this works in the interactive console ONLY. This would not work as a standard C# program. – series0ne Jan 18 '17 at 14:16 • Also note that this won't work when the hour is 23 and when the minute is 0 – TheLethalCoder Jan 18 '17 at 14:21 ## Java 8, 313300 299 bytes import java.time.*;()->{for(int c=0,h=LocalDateTime.now().getHour(),m=LocalDateTime.now().getMinute(),i;;)if(c>30){c=0;String l="",u,d;for(i=0;i++<60;)l+="-";u=l.substring(0,m);d=l.substring(m);System.out.println((h<10?"0":"")+h+" "+u+"\n"+(h<9?"0":"")+(h+1)+" "+d);}else{c++;System.out.println();}}  This only updates every 30 iterations of the while loop. The other 29 iterations just print new lines. Updated Saved 13 14 bytes due to Kevin Cruijssen's help! Thanks! • Hi, welcome to PPCG! First of all, only programs/functions are allowed, and your current code is a snippet. You'll have to surround it with a method (i.e. void f(){...} and need to add the imports it required (in your case import java.time.*;). That being said, your code can be golfed at multiple places to lower it to 311 bytes (even with the added method-declaration and import). (Since it's too long for this comment, I've placed it in the next comment.. xD) – Kevin Cruijssen Jan 18 '17 at 8:02 • import java.time.*;void f(){for(int c=0,h=LocalDateTime.now().getHour(),m=LocalDateTime.now().getMinute(),i;;)if(c>99){c=0;String l="",u,d;for(i=0;i++<61;)l+="-";u=l.substring(0,m);d=l.substring(m);System.out.println((h<10?"0":"")+h+" "+u+"\n"+(h<9?"0":"")+(h+1)+" "+d);}else{c++;System.out.println();}} (303 bytes) I recommend reading Tips for Golfing in Java and Tips for golfing in <all languages>. Enjoy your stay. – Kevin Cruijssen Jan 18 '17 at 8:20 • @KevinCruijssen I updated my answer and was able to save 3 more bytes by using lambda notation. Also I changed a few pieces to the code you provided, as well, to meet the specifications (e.g. for(i=0;i++<60 instead of 61 and (h<10? instead of 9. Thanks for informing me about method declaration and some golfing tips! – CraigR8806 Jan 18 '17 at 12:36 • Ah, the 61 instead of 60 was indeed my mistake. I thought I had written it as for(i=0;++i<61 instead of for(i=0;i++<61 (in this second case it should indeed be 60, and even though it's the same amount of bytes, it's probably more obvious/readable). The h<9 in my code is correct, though. You had h+1<10 before and I simply changed this to h<9 by removing 1 on both sides. :) – Kevin Cruijssen Jan 18 '17 at 13:52 • @KevinCruijssen Ha I didn't pick up on that! h<9. I will edit it to save 1 more byte. Thanks again! – CraigR8806 Jan 18 '17 at 13:54 # Ruby, 9895 91 bytes Updates every 5 seconds. Only works in Unix-style terminals. loop{t=Time.now;putsclear+"%02d %s %02d "%[h=t.hour,?-*m=t.min,-~h%24]+?-*(60-m);sleep 5}  Windows command prompt version, 95 92 bytes: loop{t=Time.now;puts"\e[H\e[2J%02d %s %02d "%[h=t.hour,?-*m=t.min,-~h%24]+?-*(60-m);sleep 5}  • Can you use backticks instead of system? cls vs system'cls' – IMP1 Jan 18 '17 at 10:14 • It seems not, but you can use h=t.hour and then use h instead of the second t.hour, which saves 3 bytes. – IMP1 Jan 18 '17 at 10:26 • @IMP1 indeed, backticks don't work for cls. Thanks for your other suggestion, though! – Value Ink Jan 18 '17 at 11:53 • @IMP1 as it turns out, putsclear is the way to go if you use Unix terminals. It just doesn't work with the Windows command prompt cls. – Value Ink Jan 18 '17 at 11:58 • For windows, you can puts"\e[H\e[2J" to clear the console, which I think shaves four bytes. It would make your first line read loop{t=Time.now;puts"\e[H\e[2J%02d %s – IMP1 Jan 18 '17 at 12:03 # Python, 115 113 bytes saved a couple of bytes thanks to @kundor and @Phlarx import time while 1:h,m=time.localtime()[3:5];print("\x1b[0;H{:02} {}\n{:02} {} ".format(h,"-"*m,h+1,"-"*(60-m)))  • At least on my system, this doesn't erase underlying characters, so that the number of dashes on the second line doesn't go down as time passes. Also: you can save three bytes by putting your while loop on one line, and two bytes by changing the :02 formats to just :2. – kundor Jan 17 '17 at 20:58 • You can fix the issue described by @kundor in 1 byte by adding a space after the corresponding {}. – Phlarx Jan 17 '17 at 21:23 • @kundor fixed! Thanks. I kept the :02 format to right-pad one digit hours with zeroes. – dfernan Jan 18 '17 at 8:35 • @kundor *left-pad one digit hours with zeroes. – dfernan Jan 18 '17 at 11:00 • @dfernan: Well, :2 left-pads with spaces, which the challenge says is OK. – kundor Jan 18 '17 at 16:11 # Mathematica, 235 bytes d=UpdateInterval;e=Dynamic;f=Refresh;g=AbsoluteTime;Grid[Partition[Riffle[e[f[Floor@Mod[g[]/3600+#,24],d->1]]&/@{0,1},With[{t=#},e[f[""<>Array["-"&,If[t==60,60-#,#]]&@Setting@Floor@Mod[g[]/60+#,60],d->1]]]&/@{0,60}],2],Alignment->Left]  # QBasic, 120127 121 bytes Don't run this for very long or your laptop will catch fire. Now 99.several9s% more CPU-efficient. CLS m=TIMER\60 h=m\60 m=m MOD 60 FOR i=1TO 2 ?USING"## ";h MOD 24; FOR j=1TO m ?"-"; NEXT ? h=h+1 m=60-m NEXT SLEEP 1 RUN  ### Ungolfed and explanation DO CLS totalMinutes = TIMER \ 60 hour = totalMinutes \ 60 minute = totalMinutes MOD 60 FOR row = 1 TO 2 PRINT USING "## "; hour MOD 24; FOR j = 1 TO minute PRINT "-"; NEXT j PRINT hour = hour + 1 minute = 60 - minute NEXT row SLEEP 1 LOOP  We start by clearing the screen, then get the current hours and minutes from TIMER, which returns the number of seconds since midnight. This is the first time I've tried PRINT USING, so I was delighted to discover that it doesn't suffer from the usual QBasic quirk that positive numbers are printed with a leading space. ## as the format specifier ensures that single-digit numbers are right-aligned and padded with a space, as required. We have to use a loop for the hyphens, unfortunately, since QBasic does not have a string repetition function. (If I'm mistaken, please let me know!) All the PRINT statements end with ; to suppress the newline; but after the hyphens, we need a newline; thus, the solitary ? after the inner FOR loop. The SLEEP 1 is now necessary. Without it, the screen gets cleared so quickly after printing that it's just a flickering mess. (I used LOCATE 1 instead of CLS at first for that reason, until I realized that CLS with SLEEP is shorter anyway.) RUN restarts the program from the top--the shortest way to get an infinite loop. • How does this handle the last hour of the day? Top line reads 23, but what;'s the hour on the bottom line? – steenbergh Jan 17 '17 at 21:04 • I'm using the Note7 and thinking of running this program for the foreseeable future in place of my status bar clock. Is that a good idea? – owlswipe Jan 17 '17 at 21:39 • @steenbergh Whoops, fixed. It would be helpful for you to mention that edge case in the question. – DLosc Jan 17 '17 at 22:03 • @DLosc Nah, I'm just joking :)). But yeah, smart!! – owlswipe Jan 18 '17 at 0:16 • @steenbergh He prints h MOD 24, if initially h=23 then the next loop cycle its 24 and gets modded to 0. But I'm curious if it works as well. The CLS clears the first line so there are never both printed lines on the screen, right? – Jens Jan 18 '17 at 7:18 ## Batch, 197 bytes @echo off set/ah=100+%time:~0,2%,m=1%time:~3,2% cls call:l set/ah=(h-3)%%24+100,m=260-m call:l timeout/t>nul 60 %0 :l set s=%h:~1% for /l %%i in (101,1,%m%)do call set s=%%s%%- echo %s%  Note: 10th line has a trailing space. For me, %time% formats hours with a leading space but minutes with a leading zero. I decided a leading zero was an easier output format, since all I have to do for that is to add 100 hours and remove the first digit. Minutes are trickier as 08 or 09 will cause octal parse errors, so I prefix a 1 effectively adding 100 minutes, adjusting for this by offsetting the loop appropriately, which is a byte shorter than subtracting the 100. ## Python 3.5, 127 120 117 bytes from time import* while[sleep(9)]:h,m=localtime()[3:5];print('\n'*88,*['%2d '%x+'-'*y+'\n'for x,y in[(h,m),(h+1,60-m)]])  • Can you not just print('\n'*50) instead of os.system('cls') so it works on both *nix and Windows? Would save a couple of bytes as you can lose the os import and OP says that this is allowed. – ElPedro Jan 17 '17 at 20:57 • Oh, I didn't read it properly then. Thanks a lot man. – Gurupad Mamadapur Jan 17 '17 at 21:25 • Just for info, most people tend to use <s></s> around their old byte count and then put the new byte count after it because it is interesting to see the progress as an answer is improved :-) Must try 3.5 some time. I'm still working with Python 2. – ElPedro Jan 17 '17 at 21:57 • @ElPedro Yea I forgot to do it. I'll edit now. – Gurupad Mamadapur Jan 17 '17 at 21:59 Ok, haven't done a code golf in a while, so here goes my sad attempt :) # Unix Korn Shell: 177171 170 bytes while : do clear h=date +%H m=date +%M d=----- d=d$d$d$d d=$d$d$d
a=echo $d|cut -b-$m
let m=60-$m b=echo$d|cut -b-$m let i=h+1 echo "$h $a\n$i \$b"
sleep 9
done

• spliced the 2 echos into 1, saved a few bytes ... (sleep 9 instead of sleep 10 saves 1 byte :P ) lol – Ditto Jan 17 '17 at 21:27

## AWK, 190 bytes

#!/bin/awk -f
func p(x,y,c){printf("%2s ",x)
for(j=0;j<y;j++)printf(c)
print}BEGIN{for(;;){split(strftime("%H %M"),t)
m=t[2]
if(o!=m){p(a,30,"\n")
p(t[1],m,"-")
p((t[1]+1)%24,60-m,"-")}o=m}}


Since AWK doesn't have a built-in sleep function, I simply have it continually check the clock to see if the minute has changed yet. The key thing is that it works... right? :)