[Question]
  [
# Challenge
Given that Christmas is:
* December
* Month 12
* Day 25
Every year, determine today's date, and whether or not today is Christmas.
If it is Christmas, you must print `"It's Christmas"`. If it is not Christmas, you must somehow wait until Christmas and then print `"It's Christmas"`.
# Example
From [this Stack Overflow Question](https://stackoverflow.com/questions/8379805/im-new-to-python-i-cant-tell-if-this-will-work-or-not)
```
import time
while time.strftime("%b, %d", time.localtime()) != "Dec, 25":
    time.sleep(60)
print "It's Christmas"
```
Python in 115 Characters
# Rules
Here are the rules:
* Assume that the computer's clock is always right.
* Your code must be able to be started at any time.
* Your code must print `"It's Christmas"` on Christmas.
* Looping is certainly not necessary, but once started your code should not stop until it has printed.
* Shortest code wins.
  
[Answer]
# Unix, 39 bytes
```
echo{,} "It\'s christmas"|at -t12252359
```
With help from Dennis, thanks for that. 
[Answer]
## Perl + Unix, 40 chars
```
1until`date`=~/c 25/;say"It's Christmas"
```
This is the same as [J B's Perl solution](https://codegolf.stackexchange.com/a/4110/3191), except that I save a few chars by using the external `date` command instead of Perl's `localtime`.
[Answer]
## PowerShell, 45 ~~46~~ chars
```
for(;(date).date-ne'12/25'){}"It's Christmas"
```
It's certainly not very power-efficient, so a laptop battery might die before Christmas (reason to wish for a new one, maybe). But not sleeping is definitely *shorter*.
This is also locale-agnostic. And thanks to Jaykul for a nice trick in reducing this further.
## Abusing the rules a bit, 45 chars
```
for(){"It's Christmas"*((date)-like'12/25*')}
```
This will print empty lines until it's Christmas, upon which it will print “It's Christmas”.
It ...
* ... can be started at any time.
* ... prints “It's Christmas” on Christmas. Several times. The whole day long. (The rules didn't say anything about how often it may be printed.)
* ... does *not* print “It's Christmas” on not-Christmas (although it prints an empty line in that case; can be rectified by sacrificing another character, but then this gains nothing over the more sane solution above).
* ... does not ever stop (not even after it has printed “It's Christmas” but *definitely* not before).
[Answer]
**PostScript, 90**
```
(%Calendar%)currentdevparams begin{Month 12 eq Day 25 eq and{exit}if}loop(It's Christmas)=
```
Don't run on a printer, it doesn't print a page, and it will only DoS your printer until Christmas day. Then again, getting your printer back would be a nice present.
[Answer]
## Mathematica, 47
```
While[Date[][[2;;3]]!={12,25}];"It's Christmas"
```
[Answer]
## Perl, 44 ~~45~~
```
perl -E'1until localtime=~/c 25/;say"It's Christmas"'
```
Wouldn't GMT time be sufficient? (3 characters off ;-)
[Answer]
## Perl, 45
```
{localtime=~/c 25/&&die"It's Christmas";redo}
```
## Perl, 44
using ternary operator (Thanks to Ilmari Karonen).
```
{localtime=~/c 25/?say"It's Christmas":redo}
```
[Answer]
## Javascript, 51 chars
It's a CPU killer:
```
while(!/c 25/.test(Date()));alert("It's Christmas")
```
[Answer]
# **R (47)**
```
while(!grepl("c 25",date())){};"It's Christmas"
```
[Answer]
I wanted to do this without parsing strings. Subsequently, there's a lot of magic numbers in my code.
I did some approximation to account for leap years. No one said that it had to print it out right on 00:00:00, Dec. 25!
## Perl, 80 69 57 characters
```
{(time-30931200)%31557600<86399?die"It's Christmas":redo}
```
Edited for more concise looping!
[Answer]
## Python, 66 68
```
import time
while'c 25'not in time.ctime():1
print"It's Christmas"
```
[Answer]
# TI-BASIC, ~~42~~ 38
```
Repeat 769=sum(getDate²,2
End
"It's Christmas
```
Expects the date format to be YYYY/MM/DD.
getDate creates a three-element list `{year,month,day}`; only on Christmas is month^2 + day^2 equal to 769.
23 bytes are used for the string because lowercase letters are two bytes each, except for i which is displayed as the imaginary unit token.
[Answer]
## Batch file, 68 chars
```
:l
@date/t|findstr/c:"-12-25">nul&&echo It's Christmas&&exit
@goto l
```
Not usable interactively, as it kills the session. Solving that would require 5 more characters.
Also locale-sensitive. This works on my locale which uses ISO 8601 date format.
But hey, it's a batch file (by most not even regarded as a programming language). And shorter than Javascript (and on par with Python).
[Answer]
# Groovy, 55
```
while(!new Date()==~/.*c 25.*/);
println"It's Christmas"
```
Think it works, but still waiting for output.
[Answer]
## (pdf)eTeX - 180 chars only December 1-25.
```
\lccode`m`~\let\e\expandafter\def~{\ifdim900pt<\pdfelapsedtime
sp\pdfresettimer\else\e~\fi}\lowercase\e{\e\scantokens\e
{\romannumeral\numexpr (25 - \day)*96000}}It's Christmas!\bye
```
TeX only has a way to access the date when the program starts, and the time elapsed since the start, capped at 32768 seconds, so I need to compute the number of seconds to wait, and for each second do a loop which waits for the elapsed time to reach `1s` and reset the time. (Precisely, I'm doing blocks of 900 seconds.)
Working for any month requires more work: 355 chars.
```
\lccode`m=`~\let\o\or\let\y\year\let\n\numexpr\let\e\expandafter
\def\b#1{\ifnum#1=\n(#1/4)*4\relax+1\fi}\def~{\ifdim
900pt<\pdfelapsedtime sp\pdfresettimer\else\e~\fi}\lowercase
\e{\e\scantokens\e{\romannumeral\n(25-\day+\ifcase\month\o334\b\y
\o303\b\y\o275\o244\o214\o183\o153\o122\o91\o61\o30\o0\ifnum25<\day
365\b{\n\y+1}\fi\fi)*96000}}It's Christmas!\bye
```
[Answer]
## MySQL, 180 chars
Because what are you using your database engine for, anyway?
```
DELIMITER $$
CREATE FUNCTION c() RETURNS CHAR(14) BEGIN a: LOOP IF DAY(NOW())=25 && MONTH(NOW())=12 THEN RETURN 'It\'s Christmas'; END IF; END LOOP a; END$$
DELIMITER ;
SELECT c();
```
Not very competitive lengthwise, but hey, it's doable!
[Answer]
## Ruby, 53
```
until Time.now.to_s=~/c 25/
end
puts"It's Christmas!"
```
[Answer]
# PHP, 40 bytes
```
<?while(date(dm)-1225);?>It´s Christmas;
```
Loop until 25th of December; then exit to plain mode and print.
Run with default settings (don´t display notices).
[Answer]
# 8086 machine code, 33 bytes
```
00000000  b4 2a cd 21 81 fa 19 0c  75 f6 b4 09 ba 12 01 cd  |.*.!....u.......|
00000010  21 c3 49 74 27 73 20 43  68 72 69 73 74 6d 61 73  |!.It's Christmas|
00000020  24                                                |$|
00000021
```
[Answer]
# [Forth (gforth)](http://www.complang.tuwien.ac.at/forth/gforth/Docs-html/), 84 bytes
```
: f begin time&date drop 12 = 0<> swap 25 = 0<> and until s" It's Christmas!" type ;
```
[Try it online!](https://tio.run/##Lce9CoAgFAbQV/lyqCmooKW/panHMNQSSsV7I3p6I2g6HOMj7@VmPlLqYLDqzTqwPXWuJGuo6APqBiOqYQLdMqBp/0mncDm2B0hg4YIw79ESn5IyAX6CRp9MegE "Forth (gforth) – Try It Online")
Yet another stack language. Somehow not the longest answer.
The `time&date` word is very convenient here.
A stack overflow happens since time&date values are left on stack every iteration.
[Answer]
## Javascript, ~~93~~ ~~89~~ ~~78~~ 77 chars
`function x(){Date().match("c 25")?alert("It's Christmas"):setTimeout(x,1)}x()`
[Answer]
## D, 130
```
import std.datetime,std.stdio;
main(){
do{
auto t = Clock.currTime();
}while(t.month!=12||t.day!=25);
writeln("It's Christmas");
}
```
[Answer]
## Q, 63 chars
```
system"t 1000";.z.ts:{$["12.25"~-5#-3!.z.d;1"It's Christmas";]}
```
will work for christmas day on every year
[Answer]
# SQL\*Plus + PL/SQL - 100
```
EXEC LOOP EXIT WHEN TO_CHAR(SYSDATE,'DDMM')='2512';END LOOP;DBMS_OUTPUT.put_line('It''s Christmas');
```
* Assuming `SERVEROUTPUT ON`
* Shorter then the MySql solution (eat that, MySql!)
* Too late for last year, but in time for this year
* Tried `DBMS_OUTPUT.put` instead of `DBMS_OUTPUT.put_line` but that doesn't print anything.
[Answer]
## C# (126)
```
using System;class P{static void Main(){while(DateTime.Now.Date.ToString("Md")!="1225");Console.WriteLine("It's Christmas");}}
```
Nicer for your battery:
## C# (163)
```
using s=System;class P{static void Main(){s.Threading.Thread.Sleep(s.DateTime.ParseExact("1225","Md",null)-s.DateTime.Now);s.Console.WriteLine("It's Christmas");}}
```
*edit*
The second ("nicer for your battery") version does have a bit of an issue dec. 26th to dec. 31st I just thought of :P
Both versions can probably be shortened a bit more.
[Answer]
# VBA, 58 Bytes
Anonymous VBE immediates window function that takes no input and runs until it's Christmas day, at which time it outputs `It's Christmas` to the VBE immediates window.
```
While Left(Now,5)<>"12/25":DoEvents:Wend:?"It's Christmas"
```
[Answer]
# SmileBASIC, ~~49~~ 47 bytes
```
DTREAD OUT,M,D?"It's Christmas"*(M/D==.48)EXEC.
```
`month/day` will be `0.48` on December 25th.
[Answer]
# [05AB1E](https://github.com/Adriandmen/05AB1E), ~~28~~ 21 bytes
```
[že25Qžf12Q&#}”It'sŒÎ
```
[Try it online!](https://tio.run/##yy9OTMpM/f8/@ui@VCPTwKP70gyNAtWUax81zPUsUS8@Oulw3///AA "05AB1E – Try It Online")
Noncompeting, I suppose(Beats the other non-competing answer, ha).
My first 05AB1E answer.
-7 bytes from ovs.
## Explanation
```
[že25Qžf12Q&#”It'sŒÎ
[                            start an infinite loop
 že                          push current day
   25                        25
     Q                       are they equal?
      žf                     push current month
        12                   12
          Q                  are they equal?
           &                 logical and
            #                break if both conditions are true
             ”It'sŒÎ         push "It's Christmas"
                             implicit output
```
[Answer]
# [Japt](https://github.com/ETHproductions/japt), 27 bytes
```
Ks f"c 25" ?`It's CËItµs`:P
```
To test against today's date : Replace `c 25` with this month's last letter (shorthand) + space + day of the month. `Feb 02` == `b 02`
[Try it online!](https://tio.run/nexus/japt#@@9drJCmlKxgZKqkYO@fouRZol6s4Hy427Pk0NZiJQWrgP//AQ "Japt – TIO Nexus")
[Answer]
# [Thunno 2](https://github.com/Thunno/Thunno2), 23 [bytes](https://github.com/Thunno/Thunno2/blob/main/docs/codepage.md)
```
(kNkM,¿⁺P¿Q)’It's ñẈmas
```
[Try it online!](https://Not-Thonnu.github.io/run#aGVhZGVyPSZjb2RlPShrTmtNJTJDJUMyJUJGJUUyJTgxJUJBUCVDMiVCRlEpJUUyJTgwJTk5SXQncyUyMCVDMyVCMSVFMSVCQSU4OG1hcyZmb290ZXI9JmlucHV0PSZmbGFncz0=)
#### Explanation
```
(kNkM,¿⁺P¿Q)’It's ñẈmas  '# Full program
(          )              # Loop until this returns false:
 kNkM,                    #   Push [current month, current day]
      ¿⁺P¿Q               #   Not equal to [12, 25]
            ’It's ñẈmas  '# Push "It's Christmas"
                          # Implicit output
```
]