0
として提供する場合、前月の最終日を取得dayValue
しDate.setFullYear
ます。
d = new Date(); d.setFullYear(2008, 11, 0); // Sun Nov 30 2008
mozillaでこの動作への参照があります。これは信頼できるクロスブラウザ機能ですか、それとも別の方法を検討する必要がありますか?
0
として提供する場合、前月の最終日を取得dayValue
しDate.setFullYear
ます。
d = new Date(); d.setFullYear(2008, 11, 0); // Sun Nov 30 2008
mozillaでこの動作への参照があります。これは信頼できるクロスブラウザ機能ですか、それとも別の方法を検討する必要がありますか?
回答:
var month = 0; // January
var d = new Date(2008, month + 1, 0);
alert(d); // last day in January
IE 6: Thu Jan 31 00:00:00 CST 2008
IE 7: Thu Jan 31 00:00:00 CST 2008
IE 8: Beta 2: Thu Jan 31 00:00:00 CST 2008
Opera 8.54: Thu, 31 Jan 2008 00:00:00 GMT-0600
Opera 9.27: Thu, 31 Jan 2008 00:00:00 GMT-0600
Opera 9.60: Thu Jan 31 2008 00:00:00 GMT-0600
Firefox 2.0.0.17: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Firefox 3.0.3: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Google Chrome 0.2.149.30: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Safari for Windows 3.1.2: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
出力の違いはtoString()
、日付の違いではなく、実装の違いによるものです。
もちろん、上記で特定されたブラウザが前月の最終日として0を使用しているからといって、継続することを意味するわけではありません。すべてのブラウザで同じように。
new Date
は他の計算方法よりも非常に遅いため、パフォーマンスチャートにも表示されないことに注意してください:jsperf.com/days-in-month-perf-test/6
次の月の最初の日で中間日付を使用し、前日の日付を返します。
int_d = new Date(2008, 11+1,1);
d = new Date(int_d - 1);
today = new Date(); new Date(today.getFullYear(), today.getMonth()+1, 0).toString();
これが私にとって最良の解決策であると思います。Dateオブジェクトに計算させてください。
var today = new Date();
var lastDayOfMonth = new Date(today.getFullYear(), today.getMonth()+1, 0);
dayパラメータを0に設定すると、前月の最終日である月の最初の日よりも1日少なくなります。
new Date
が非常に遅いため、パフォーマンスチャートにも表示されません:jsperf.com/days-in-month-perf-test/6
コンピュータの観点から、new Date()
そしてregular expression
解決策は遅いです!あなたは超高速(超不可解な)ワンライナーをしたい場合は、仮定(これを試してみてくださいm
ですJan=1
フォーマットがます)。最高のパフォーマンスを得るために、さまざまなコードの変更を試み続けています。
私の現在の最速バージョン:
この関連する質問うるう年チェックをビットごとの演算子(驚異的な速度)を使用して確認し、25と15のマジックナンバーが何を表しているかを発見した後、この最適化された答えの組み合わせを思いつきました。
function getDaysInMonth(m, y) {
return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}
ビットシフトを考えると、これは明らかにあなたのm
&y
文字列として数値を渡すと奇妙な結果が生じるためパラメーターが両方とも整数である。
JSFiddle: http ://jsfiddle.net/TrueBlueAussie/H89X3/22/
JSPerfの結果: http
何らかの理由で、(m+(m>>3)&1)
より効率的である(5546>>m&1)
上、ほぼすべてのブラウザ。
速度に関する唯一の真の競争は@GitaarLabからのものであるため、私はテストするための直接のJSPerfを作成しました:http ://jsperf.com/days-in-month-head-to-head/5
ここで私のうるう年の答えに基づいて機能します:ここでうるう年を見つけるためのjavascriptここでうるう年を見つけるビットワイズ演算子(驚異的な速度)と次のバイナリロジックを使用したうるう年チェック。
バイナリ月の簡単なレッスン:
目的の月(Jan = 1)のインデックスをバイナリで解釈すると、31日の月のビット3がクリアでビット0が設定されているか、ビット3がセットでビット0がクリアであることがわかります。
Jan = 1 = 0001 : 31 days
Feb = 2 = 0010
Mar = 3 = 0011 : 31 days
Apr = 4 = 0100
May = 5 = 0101 : 31 days
Jun = 6 = 0110
Jul = 7 = 0111 : 31 days
Aug = 8 = 1000 : 31 days
Sep = 9 = 1001
Oct = 10 = 1010 : 31 days
Nov = 11 = 1011
Dec = 12 = 1100 : 31 days
手段はあなたが値3つの場所をシフトすることができる>> 3
、XORオリジナルとビット^ m
と結果があるかどう1
か、0
ビット位置0に使用& 1
。注:+
XOR(^
)よりもわずかに速く(m >> 3) + m
、ビット0でも同じ結果が得られます。
JSPerfの結果:http : //jsperf.com/days-in-month-perf-test/6
:)
私が投稿した最初の回答バージョンには、実際には不要なブラケットのセットがありましたが、削除されたので(私があなたに貸し付けました)、キャラクターを剃り、これで終わりました。あの楽しい日はまだありがたい、乾杯!
y
とm
、変数が整数でない文字列でなければなりません!たとえば、2月の場合は30を返します。これをparseInt()
機能させるには関数を使用する必要がありました。
私は最近同様のことをしなければなりませんでした、これは私が思いついたものです:
/**
* Returns a date set to the begining of the month
*
* @param {Date} myDate
* @returns {Date}
*/
function beginningOfMonth(myDate){
let date = new Date(myDate);
date.setDate(1)
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
return date;
}
/**
* Returns a date set to the end of the month
*
* @param {Date} myDate
* @returns {Date}
*/
function endOfMonth(myDate){
let date = new Date(myDate);
date.setMonth(date.getMonth() +1)
date.setDate(0);
date.setHours(23);
date.setMinutes(59);
date.setSeconds(59);
return date;
}
日付を渡すと、月初または月末のいずれかに設定された日付が返されます。
begninngOfMonth
機能はかなり自明ですが、どのようにして起こっているendOfMonth
機能は、私は次の月に月をインクリメントした後、使用しているということですsetDate(0)
の一部であり、前月の最後の日に日ロールバックしますsetDate仕様:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate https://www.w3schools.com/jsref/jsref_setdate.asp
次に、時間/分/秒を1日の終わりに設定します。これにより、日付範囲を想定しているある種のAPIを使用している場合、その最終日の全体をキャプチャできるようになります。その部分は、元の投稿が求めているものを超える可能性がありますが、同様の解決策を探している誰かを助けることができます。
編集:setMilliseconds()
さらに正確にしたい場合は、さらに1マイル進んでミリ秒を設定することもできます。
これにより、現在の月が最初と最後の日になります。
「年」を変更する必要がある場合は、d.getFullYear()を削除して年を設定します。
「月」を変更する必要がある場合は、d.getMonth()を削除して年を設定します。
var d = new Date();
var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var fistDayOfMonth = days[(new Date(d.getFullYear(), d.getMonth(), 1).getDay())];
var LastDayOfMonth = days[(new Date(d.getFullYear(), d.getMonth() + 1, 0).getDay())];
console.log("First Day :" + fistDayOfMonth);
console.log("Last Day:" + LastDayOfMonth);
alert("First Day :" + fistDayOfMonth);
alert("Last Day:" + LastDayOfMonth);
これを試して:
function _getEndOfMonth(time_stamp) {
let time = new Date(time_stamp * 1000);
let month = time.getMonth() + 1;
let year = time.getFullYear();
let day = time.getDate();
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
case 2:
if (_leapyear(year))
day = 29;
else
day = 28;
break
}
let m = moment(`${year}-${month}-${day}`, 'YYYY-MM-DD')
return m.unix() + constants.DAY - 1;
}
function _leapyear(year) {
return (year % 100 === 0) ? (year % 400 === 0) : (year % 4 === 0);
}
以下の関数は、月の最終日を示します。
function getLstDayOfMonFnc(date) {
return new Date(date.getFullYear(), date.getMonth(), 0).getDate()
}
console.log(getLstDayOfMonFnc(new Date(2016, 2, 15))) // Output : 29
console.log(getLstDayOfMonFnc(new Date(2017, 2, 15))) // Output : 28
console.log(getLstDayOfMonFnc(new Date(2017, 11, 15))) // Output : 30
console.log(getLstDayOfMonFnc(new Date(2017, 12, 15))) // Output : 31
同様に、月の最初の日を取得できます。
function getFstDayOfMonFnc(date) {
return new Date(date.getFullYear(), date.getMonth(), 1).getDate()
}
console.log(getFstDayOfMonFnc(new Date(2016, 2, 15))) // Output : 1
const today = new Date();
let beginDate = new Date();
let endDate = new Date();
// fist date of montg
beginDate = new Date(
`${today.getFullYear()}-${today.getMonth() + 1}-01 00:00:00`
);
// end date of month
// set next Month first Date
endDate = new Date(
`${today.getFullYear()}-${today.getMonth() + 2}-01 :23:59:59`
);
// deducting 1 day
endDate.setDate(0);
これは、最初の日付のGMTと時刻を保存する答えです
var date = new Date();
var first_date = new Date(date); //Make a copy of the date we want the first and last days from
first_date.setUTCDate(1); //Set the day as the first of the month
var last_date = new Date(first_date); //Make a copy of the calculated first day
last_date.setUTCMonth(last_date.getUTCMonth() + 1); //Add a month
last_date.setUTCDate(0); //Set the date to 0, this goes to the last day of the previous month
console.log(first_date.toJSON().substring(0, 10), last_date.toJSON().substring(0, 10)); //Log the dates with the format yyyy-mm-dd
私はそれが意味論の問題であることを知っていますが、私はこの形でそれを使用することになりました。
var lastDay = new Date(new Date(2008, 11+1,1) - 1).getDate();
console.log(lastDay);
関数は内側の引数から外側に向かって解決されるため、同じように機能します。
その後、年、月/年を現在の日付からのものであるかどうかにかかわらず、必要な詳細で置き換えることができます。または特定の月/年。