你好我是一个非常新的Javascript,我需要制作一个允许某人输入日期的代码,这将导致日期所在的季节。我对我应该做的事情感到茫然,如果不知道的话声明?就我而言,谢谢大家的时间!
<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 (
答案 0 :(得分:16)
毫无疑问,计算至日和昼夜平分点并不是你想到的,但它们并不太难。
与一些人所说的相反,冬至和昼夜平分点不依赖于你的位置,尽管他们的名字在冬天被全球一半的人称为夏天。
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))
}
答案 1 :(得分:5)
请注意,有更好的方法可以做到这一点(例如,使用日期对象),这可能会更有用/更灵活,特别是如果你想根据实际季节开始/停止日期(3月28日)确定, 例如)。这只是为了展示一个起点。
这是一个非常简单的例子,使用swtich()根据数字月份返回一个季节:
<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);
}
这是一个更复杂的例子,显示短/长月加上数字月。
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);
}
有点不同的方法可能是为季节创建变量,使用if / else语句(因为OP想要一个例子)并在其中一个变量中找到月份值的“索引”(注意我在月末添加了,
[逗号]以消除1中的1和从0消除1,等等......)。
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);
}
答案 2 :(得分:5)
这是一个单行。
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())])
答案 3 :(得分:3)
可自定义的季节,可以执行以下操作:
请注意,月份是0(一月)至11(十二月)。
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) =>
before(mdX, mdHigh) && after(mdX, mdLow)
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'
)
答案 4 :(得分:0)
把跨过新年的季节分开:
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;
}