Sample HTML
<canvas id="canvas" width="300" height="150"></canvas>
Sample Script
(function () {
var canvas = null;
var context = null;
window.addEventListener("load", function() {
canvas = document.getElementById("canvas");
context = canvas.getContext('2d');
setInterval(draw, 1000);
}, false);
function draw() {
// canvasをクリア
context.clearRect(0, 0, 300, 150);
// 現在の日時を取得
var t = new Date();
// 背景を描画
drawBackGround(t);
// 太陽または月を描画
drawSunMoon(t);
// 日時を描画
drawDatetime(t);
}
/* 背景を描画 */
function drawBackGround(t) {
// 現在のcanvasの状態を保存
context.save();
// 背景の色を時間によって確定
var h = t.getHours();
if( h >= 6 && h < 18 ) {
context.fillStyle = "#a4eaf6";
} else {
context.fillStyle = "#000044";
}
// 背景を塗りつぶす
context.fillRect(0, 0, 300, 150);
// canvasの状態を元に戻す
context.restore();
}
/* 太陽または月を描画 */
function drawSunMoon(t) {
var h = t.getHours();
if( h >= 6 && h < 18 ) {
// 太陽を描画
drawSun(t);
} else {
// 月を描画
drawMoon(t);
// 星を描画
drawStars();
}
}
/* 太陽を描画 */
function drawSun(t) {
// 現在のcanvasの状態を保存
context.save();
// 太陽を描画
var rad = getAngle(t);
var p = getArcArg(rad);
context.beginPath();
context.arc(p.x, p.y, p.radius, p.startAngle, p.endAngle, p.anticlockwise);
var grad = context.createRadialGradient(p.x, p.y, 0, p.x, p.y, p.radius);
grad.addColorStop(0, "#ffffff");
grad.addColorStop(0.5, "#FFFB13");
grad.addColorStop(1, "#FFCB1D");
context.fillStyle = grad;
context.fill();
// canvasの状態を元に戻す
context.restore(t);
}
/* 月を描画 */
function drawMoon(t) {
// 現在の canvas の状態を保存
context.save();
// 月を描画
var rad = getAngle(t);
var p = getArcArg(rad);
context.fillStyle = "yellow";
context.beginPath();
context.arc(p.x, p.y, p.radius, p.startAngle, p.endAngle, p.anticlockwise);
context.fill();
// 月の満ち欠けを描画
var q = getArcArg(rad - Math.PI / 24);
context.fillStyle = "#000044";
context.beginPath();
context.arc(q.x, q.y, q.radius, q.startAngle, q.endAngle, q.anticlockwise);
context.fill();
// canvas の状態を元に戻す
context.restore();
}
/* 星を描画 */
function drawStars() {
// 現在のcanvasの状態を保存
context.save();
// 星をランダムに描画
context.strokeStyle = "rgba(255, 255, 0, 0.5)";
for( var i=0; i<20; i++ ) {
var s = getRandomPos();
context.beginPath();
context.moveTo(s.x-2, s.y);
context.lineTo(s.x+2, s.y);
context.stroke();
context.beginPath();
context.moveTo(s.x, s.y-4);
context.lineTo(s.x, s.y+4);
context.stroke();
}
// canvasの状態を元に戻す
context.restore();
}
/* 太陽または月の角度(ラジアン)を算出 */
function getAngle(t) {
// 06:00または18:00から今までの経過秒数
var h = t.getHours();
var m = t.getMinutes();
var s = t.getSeconds();
var sec = (h * 3600) + (m * 60) + s;
if( h < 6 ) {
sec += 3600*6;
} else if( h < 18 ) {
sec -= 3600*6;
} else {
sec -= 3600*18;
}
// 月の角度
var rad = Math.PI * ( 1 - ( sec / 43200 ) );
return rad;
}
/* 太陽または月の円を描くarc()メソッドの引数を算出 */
function getArcArg(rad) {
var arg = {
x: 150 + Math.cos(rad) * 100,
y: 150 - Math.sin(rad) * 100,
radius: 30,
startAngle: 0,
endAngle: Math.PI * 2,
anticlockwise:false
};
return arg;
}
/* 星の座標をランダムに算出 */
function getRandomPos() {
var pos = {
x: Math.random() * 300,
y: Math.random() * 150
};
return pos;
}
/* 日時を描画 */
function drawDatetime(t) {
// 現在のcanvasの状態を保存
context.save();
// 日付の文字列
var yer = (t.getYear() + 1900).toString();
var mon = ((t.getMonth() + 1).toString()).replace(/^(\d)$/, "0$1");
var dat = ((t.getDate()).toString()).replace(/^(\d)$/, "0$1");
var wek = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sut"][t.getDay()];
var date = yer + "-" + mon + "-" + dat + "(" + wek + ")";
// 時間の文字列
var hur = ((t.getHours()).toString()).replace(/^(\d)$/, "0$1");
var min = ((t.getMinutes()).toString()).replace(/^(\d)$/, "0$1");
var sec = ((t.getSeconds()).toString()).replace(/^(\d)$/, "0$1");
var time = hur + ":" + min + ":" + sec;
// canvasに描画
var h = t.getHours();
if( h >= 6 && h < 18 ) {
context.fillStyle = "#000044";
} else {
context.fillStyle = "#e3f4fe";
}
context.font = "18px 'Monotype Corsiva'";
context.fillText(date, 10, 30);
context.fillText(time, 10, 50);
// canvasの状態を元に戻す
context.restore();
}
})();