Javascript coding: Input a specific date, Output the season
Hel开发者_如何学Pythonlo I a very new to Javascript and I need to make a code that allows someone to enter a date and it will result in the season that date is in. I am at a loss at what I should do, an if else statement? This is as far as I got, thank you for everyone's time!
<body>
<h1>Date to Season</h1>
<p align="left">Enter Date:
<input id="season" maxlength="4" size="24"/>
</p>
<input type="button" value="Submit" onclick="Submit()"/><br/>
<textarea cols="40" rows="3" id="output"></textarea></body>
<script type="text/javascript">
function Submit(){
var date = document.getElementById('season').value;
var seasons =
if (
No doubt calculating solstices and equinoxes is not what you had in mind, but they are not too difficult.
Contrary to what some have said, solstices and equinoxes do not depend on where you are, though their names do- winter is called summer by somebody on half the globe.
Date.fromJulian= function(j){
j= (+j)+(30.0/(24*60*60));
var A= Date.julianArray(j, true);
return new Date(Date.UTC.apply(Date, A));
}
Date.julianArray= function(j, n){
var F= Math.floor;
var j2, JA, a, b, c, d, e, f, g, h, z;
j+= .5;
j2= (j-F(j))*86400.0;
z= F(j);
f= j-z;
if(z< 2299161) a= z;
else{
g= F((z-1867216.25)/36524.25);
a= z+1+g-F(g/4);
}
b= a+1524;
c= F((b-122.1)/365.25);
d= F(365.25*c);
e= F((b-d)/30.6001);
h= F((e< 14)? (e-1): (e-13));
var JA= [F((h> 2)? (c-4716): (c-4715)),
h-1, F(b-d-F(30.6001*e)+f)];
var JB= [F(j2/3600), F((j2/60)%60), Math.round(j2%60)];
JA= JA.concat(JB);
if(typeof n== 'number') return JA.slice(0, n);
return JA;
}
Date.getSeasons= function(y, wch){
y= y || new Date().getFullYear();
if(y<1000 || y> 3000) throw y+' is out of range';
var Y1= (y-2000)/1000, Y2= Y1*Y1, Y3= Y2*Y1, Y4= Y3*Y1;
var jd, t, w, d, est= 0, i= 0, Cos= Math.degCos, A= [y],
e1= [485, 203, 199, 182, 156, 136, 77, 74, 70, 58, 52, 50, 45, 44, 29, 18, 17, 16, 14, 12, 12, 12, 9, 8],
e2= [324.96, 337.23, 342.08, 27.85, 73.14, 171.52, 222.54, 296.72, 243.58, 119.81, 297.17, 21.02,
247.54, 325.15, 60.93, 155.12, 288.79, 198.04, 199.76, 95.39, 287.11, 320.81, 227.73, 15.45],
e3= [1934.136, 32964.467, 20.186, 445267.112, 45036.886, 22518.443,
65928.934, 3034.906, 9037.513, 33718.147, 150.678, 2281.226,
29929.562, 31555.956, 4443.417, 67555.328, 4562.452, 62894.029,
31436.921, 14577.848, 31931.756, 34777.259, 1222.114, 16859.074];
while(i< 4){
switch(i){
case 0: jd= 2451623.80984 + 365242.37404*Y1 + 0.05169*Y2 - 0.00411*Y3 - 0.00057*Y4;
break;
case 1: jd= 2451716.56767 + 365241.62603*Y1 + 0.00325*Y2+ 0.00888*Y3 - 0.00030*Y4;
break;
case 2: jd= 2451810.21715 + 365242.01767*Y1 - 0.11575*Y2 + 0.00337*Y3 + 0.00078*Y4;
break;
case 3: jd= 2451900.05952 + 365242.74049*Y1 - 0.06223*Y2 - 0.00823*Y3 + 0.00032*Y4;
break;
}
var t= (jd- 2451545.0)/36525,
w= 35999.373*t - 2.47,
d= 1 + 0.0334*Cos(w)+ 0.0007*Cos(2*w);
est= 0;
for(var n= 0; n<24; n++){
est += e1[n]*Cos(e2[n]+(e3[n]*t));
}
jd+= (0.00001*est)/d;
A[++i]= Date.fromJulian(jd);
}
return wch && A[wch]? A[wch]: A;
}
Math.degRad= function(d){
return (d*Math.PI)/180.0
}
Math.degSin= function(d){
return Math.sin(Math.degRad(d))
}
Math.degCos= function(d){
return Math.cos(Math.degRad(d))
}
Here's a one-liner.
const getSeason = d => Math.floor((d.getMonth() / 12 * 4)) % 4
console.log('Southern hemisphere (Summer as Dec/Jan/Feb etc...):')
console.log(['Summer', 'Autumn', 'Winter', 'Spring'][getSeason(new Date())])
console.log('Northern hemisphere (Winter as Dec/Jan/Feb etc...):')
console.log(['Winter', 'Spring', 'Summer', 'Autumn'][getSeason(new Date())])
Customizable seasons, can do the following:
- astronomical
- meteorological
- 6 seasons
- any natural number
Note that months are 0 (Jan) to 11 (Dec).
const md = (month, day) => ({month, day})
const toMd = date => md(date.getMonth(), date.getDate())
const before = (md1, md2) => (md1.month < md2.month)
|| ((md1.month === md2.month) && (md1.day <= md2.day))
const after = (md1, md2) => !before(md1, md2)
const between = (mdX, mdLow, mdHigh) =>
after(mdX, mdLow) && before(mdX, mdHigh)
const season = (date, seasons) => ((md = toMd(date)) =>
Object.keys(seasons).find(season => seasons[season](md))
)()
const MARCH_EQUINOX = md(2, 20)
const JUNE_SOLSTICE = md(5, 21)
const SEPTEMBER_EQUINOX = md(8, 23)
const DECEMBER_SOLSTICE = md(11, 21)
const NEW_YEAR = md(0, 1)
const seasons = {
spring: d => between(d, MARCH_EQUINOX, JUNE_SOLSTICE),
summer: d => between(d, JUNE_SOLSTICE, SEPTEMBER_EQUINOX),
fall: d => between(d, SEPTEMBER_EQUINOX, DECEMBER_SOLSTICE),
winter: d =>
between(d, DECEMBER_SOLSTICE, NEW_YEAR) ||
between(d, NEW_YEAR, MARCH_EQUINOX)
}
console.log(
'It is currently',
season(new Date(), seasons),
'in northern hemisphere on 4 season astronomical calendar'
)
Note, there are saner ways of doing this (for instance, using a date object for instance), that would probably be more useful/flexible, especially if you want to determine by the actual season start/stop date (March 28th, for example). This is just to demonstrate a starting point.
Here's a very simple example, using a swtich() to return a season according to a numeric month:
http://jsfiddle.net/RtC58/
<form name="date">
<input type="text" name="month"/>
<input type="button" value="Season?" onClick="getSeason()"/>
</form>
function getSeason() {
month = document.forms.date.month.value;
season = '';
switch(month) {
case '12':
case '1':
case '2':
season = 'winter';
break;
case '3':
case '4':
case '5':
season = 'spring';
break;
case '6':
case '7':
case '8':
season = 'summer';
break;
case '9':
case '10':
case '11':
season = 'fall';
break;
}
alert(season);
}
Here's a little bit more complex example, showing the short/long month plus the numeric month.
http://jsfiddle.net/RtC58/1/
function getSeason() {
month = document.forms.date.month.value.toLowerCase();
season = 'unknown';
switch(month) {
case 'dec':
case 'december':
case '12':
case 'jan':
case 'january':
case '1':
case 'feb':
case 'february':
case '2':
season = 'winter';
break;
case 'mar':
case 'march':
case '3':
case 'apr':
case 'april':
case '4':
case 'may':
case '5':
season = 'spring';
break;
case 'jun':
case 'june':
case '6':
case 'jul':
case 'july':
case '7':
case 'aug':
case 'august':
case '8':
season = 'summer';
break;
case 'sep':
case 'september':
case '9':
case 'oct':
case 'october':
case '10':
case 'nov':
case 'november':
case '11':
season = 'fall';
break;
}
alert(season);
}
A little bit different approach could be to create variables for the seasons, use if/else statements (as the OP wants an example of) and find the 'index of' the month value in the one of the variables (note I added a ,
[comma] to the end of the month to disambiguate 1 from 12 and 1 from 0, etc...).
http://jsfiddle.net/RtC58/3/
function getSeason() {
month = document.forms.date.month.value.toLowerCase()+",";
winter = 'dec,december,jan,january,feb,february,12,1,2,';
spring = 'mar,march,apr,april,may,3,4,5,';
summer = 'jun,june,jul,july,aug,august,6,7,8,';
fall = 'sep,september,oct,october,nov,november,9,10,11,';
season = 'unknown';
if (winter.indexOf(month) != -1) {
season = 'winter';
} else if (spring.indexOf(month) != -1) {
season = 'spring';
} else if (summer.indexOf(month) != -1) {
season = 'summer';
} else if (fall.indexOf(month) != -1) {
season = 'fall';
}
alert(season);
}
Just split the season that crosses newyear:
const seasons = [{
name: 'Spring',
start: new Date(2000, 2, 21),
end: new Date(2000, 5, 20)
},{
name: 'Summer',
start: new Date(2000, 5, 21),
end: new Date(2000, 8, 20)
},{
name: 'Autumn/Fall',
start: new Date(2000, 8, 21),
end: new Date(2000, 11, 20)
},{
name: 'Winter',
start: new Date(2000, 11, 21),
end: new Date(2001, 2, 20)
}];
/** Checks if a date is within a specified season */
function checkSeason(season, date) {
let remappedStart = new Date(2000, season.start.getMonth(), season.start.getDate());
let remappedDate = new Date(2000, date.getMonth(), date.getDate());
let remappedEnd = new Date(2000, season.end.getMonth(), season.end.getDate());
// Check if the season crosses newyear
if (season.start.getFullYear() === season.end.getFullYear()) {
// Simple comparison
return (remappedStart <= remappedDate) && (remappedDate <= remappedEnd);
} else {
// Split the season, remap all to year 2000, and perform a simple comparison
return (remappedStart <= remappedDate) && (remappedDate <= new Date(2000, 11, 31))
|| (new Date(2000, 0, 1) <= remappedDate) && (remappedDate <= remappedEnd);
}
}
function findSeason(seasons, date) {
for (let i = 0; i < seasons.length; i++) {
let isInSeason = checkSeason(seasons[i], date);
if (isInSeason === true) {
return seasons[i];
}
}
return null;
}
Fiddle: https://jsfiddle.net/pieterjandc/L3prwqmh/1/
精彩评论