开发者

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/

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜