আমি 1 - 366 থেকে বছরের দিন গণনা করতে জাভাস্ক্রিপ্ট কীভাবে ব্যবহার করব? উদাহরণ স্বরূপ:
- জানুয়ারী 3 হতে হবে 3 ।
- 1 ফেব্রুয়ারি 32 হওয়া উচিত ।
আমি 1 - 366 থেকে বছরের দিন গণনা করতে জাভাস্ক্রিপ্ট কীভাবে ব্যবহার করব? উদাহরণ স্বরূপ:
উত্তর:
ওপি'র সম্পাদনা অনুসরণ করছেন:
var now = new Date();
var start = new Date(now.getFullYear(), 0, 0);
var diff = now - start;
var oneDay = 1000 * 60 * 60 * 24;
var day = Math.floor(diff / oneDay);
console.log('Day of year: ' + day);
সম্পাদনা: উপরের কোড ব্যর্থ হবে যখন nowমার্চ 26 এবং 29th অক্টোবর এবং এরই মধ্যবর্তী কোন তারিখ nowএর সময় রাত 1 টা আগে (যেমন 00:59:59)। কোডটি দিবালোকের সঞ্চয় সময় বিবেচনায় না নেওয়ার কারণে ঘটে। আপনার এটির জন্য ক্ষতিপূরণ দেওয়া উচিত :
var now = new Date();
var start = new Date(now.getFullYear(), 0, 0);
var diff = (now - start) + ((start.getTimezoneOffset() - now.getTimezoneOffset()) * 60 * 1000);
var oneDay = 1000 * 60 * 60 * 24;
var day = Math.floor(diff / oneDay);
console.log('Day of year: ' + day);
Math.floorধারাবাহিকভাবে আমাকে এপ্রিলের নির্দিষ্ট দিনের পরে প্রত্যাশার চেয়ে 1 দিন কম ফলাফল দেয়। Math.ceilপ্রত্যাশার মতো কাজ করেছেন, তবে আমি দেখেছি যে আপনি যে Math.roundকোনও একটির পরিবর্তে ব্যবহার করুন।
new Date(2014, 0, 1)এবং এটি ব্যবহার করেন না new Date(2014, 0, 0)। এটা কি ইচ্ছাকৃত? সম্ভবত এক দিন বন্ধ হয়ে যাওয়ার জন্য অ্যাকাউন্টগুলি new Date(2014, 0, 0)ফিরে আসবে 12/31/2013।
.setUTCHoursএবং Date.UTC()আরও নির্ভরযোগ্য সমাধানের জন্য।
ceilচেয়ে সহজ সমাধানটি এর পরিবর্তে ব্যবহার করা floor, এটি আপনাকে এমন একটি সংখ্যক সিস্টেম দেবে যেখানে জানুয়ারি 1 = 1 আপনি যদি 1 লা জানুয়ারী (0 floor) আপনাকে চান তবে আপনার চূড়ান্ত ফলাফল থেকে 1 টি বিয়োগ করুন।
var diff = now - start + (start.getTimezoneOffset() - now.getTimezoneOffset()) * 60 * 1000;
এটি সমস্ত দেশে দিবালোক সঞ্চয় সময় পরিবর্তন জুড়ে কাজ করে (উপরের "দুপুর" অস্ট্রেলিয়ায় কাজ করে না):
Date.prototype.isLeapYear = function() {
var year = this.getFullYear();
if((year & 3) != 0) return false;
return ((year % 100) != 0 || (year % 400) == 0);
};
// Get Day of Year
Date.prototype.getDOY = function() {
var dayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
var mn = this.getMonth();
var dn = this.getDate();
var dayOfYear = dayCount[mn] + dn;
if(mn > 1 && this.isLeapYear()) dayOfYear++;
return dayOfYear;
};
getDay()এটিকে পরিবর্তন করতে হবে getDate()। প্রাক্তন সপ্তাহের দিনটি (0 = রবিবার..6 = শনিবার) ফেরায়, দিনটি নয়।
আমি এটি খুব আকর্ষণীয় মনে করি যে কেউ ইউটিসি ব্যবহারের বিষয়টি বিবেচনা করে না কারণ এটি ডিএসটি সাপেক্ষে নয়। অতএব, আমি নিম্নলিখিত প্রস্তাব:
function daysIntoYear(date){
return (Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()) - Date.UTC(date.getFullYear(), 0, 0)) / 24 / 60 / 60 / 1000;
}
আপনি নিম্নলিখিতটি দিয়ে এটি পরীক্ষা করতে পারেন:
[new Date(2016,0,1), new Date(2016,1,1), new Date(2016,2,1), new Date(2016,5,1), new Date(2016,11,31)]
.forEach(d =>
console.log(`${d.toLocaleDateString()} is ${daysIntoYear(d)} days into the year`));
লিপ ইয়ার 2016 এর জন্য কোন ফলাফল রয়েছে ( http://www.epochconverter.com/days/2016 ব্যবহার করে যাচাই করা হয়েছে ):
1/1/2016 is 1 days into the year
2/1/2016 is 32 days into the year
3/1/2016 is 61 days into the year
6/1/2016 is 153 days into the year
12/31/2016 is 366 days into the year
function doyToDate(doy, year) { return new Date(year, 0, doy); }
new Date(8640000000000000), যা এখনও কম Number.MAX_SAFE_INTEGER। এই উত্তরটি দেখুন: stackoverflow.com/a/11526569/18511
Date.prototype.dayOfYear= function(){
var j1= new Date(this);
j1.setMonth(0, 0);
return Math.round((this-j1)/8.64e7);
}
alert(new Date().dayOfYear())
ভাগ্যক্রমে এই প্রশ্নের উত্তর দেয় না যে বর্তমান দিনের নম্বর প্রয়োজন কিনা তা নির্দিষ্ট করে না ।
এছাড়াও কিছু উত্তরে (অন্যান্য প্রশ্নেও) লিপ-ইয়ার সমস্যা ছিল বা ডেট-অবজেক্ট ব্যবহার করা হয়েছিল। যদিও জাভাস্ক্রিপ্টের Date objectকভারেজ প্রায় ২৮৫6১ years বছর (১,০০,০০,০০০ দিন) একদিকে জানুয়ারী ১, ১৯ of০ এর উভয় দিকে, আমি বিভিন্ন ব্রাউজারগুলিতে সমস্ত ধরণের অপ্রত্যাশিত তারিখের অসঙ্গতিতে বিরক্ত হয়েছি (বেশিরভাগ ক্ষেত্রে বছর 0 থেকে 99)। আমি কীভাবে এটি হিসাব করব তা জানতে আগ্রহী ছিলাম।
তাই আমি সঠিক ( প্রলেপটিক গ্রেগরিয়ান / অ্যাস্ট্রোনমিক্যাল / আইএসও 8601: 2004 (ধারা ৪.৩.২.১) গণনা করার জন্য একটি সহজ এবং সর্বোপরি ছোট অ্যালগরিদম লিখেছি , সুতরাং বছরটি বিদ্যমান এবং এটি একটি লিপ বছর এবং নেতিবাচক বছরগুলি সমর্থিত ) বছরের দিন উপর ভিত্তি করে বছর , মাস এবং দিন ।
উল্লেখ্য যে শিরোনামে, বছর 0 খ্রিস্টাব্দ / বিসি বিদ্যমান নেই: পরিবর্তে বছরটি লিপ-বছর! আপনার যদি খ্রিস্টপূর্ব স্বরলিপিটির জন্য অ্যাকাউন্ট প্রয়োজন হয় তবে কেবলমাত্র (অন্যথায় ইতিবাচক) বছরের মূল্যবোধের এক বছর আগে বিয়োগ করুন !! 0AD/BC1 BC
আমি (জাভাস্ক্রিপ্ট) মডিফাই শর্ট সার্কিট বিট-মাস্কের-মডিউল leapYear অ্যালগরিদম এবং একটি বিট ভিত্তিক লুকআপ করতে একটি ম্যাজিক নম্বর নিয়ে এসেছেন অফসেট (যে বাদ জানুয়ারী এবং ফেব্রুয়ারী, এইভাবে 10 * 3 বিট প্রয়োজন (30 বিট কম 31 বিটস, যাতে আমরা বিটশিট-এর পরিবর্তে অন্য অক্ষরটি নিরাপদে সংরক্ষণ করতে পারি >>>))।
নোট করুন যে কোনও মাস বা দিন হতে পারে না 0। তার মানে যে আপনি শুধু এই সমীকরণ প্রয়োজন হলে বর্তমান দিন (এটি ব্যবহার খাওয়ানোর .getMonth()) আপনি শুধু সরানোর প্রয়োজন --থেকে --m।
নোট করুন এটি একটি বৈধ তারিখ ধরেছে (যদিও ত্রুটি-চেকিংয়ের জন্য কিছু অক্ষর আরও বেশি)।
function dayNo(y,m,d){
return --m*31-(m>1?(1054267675>>m*3-6&7)-(y&3||!(y%25)&&y&15?0:1):0)+d;
}
<!-- some examples for the snippet -->
<input type=text value="(-)Y-M-D" onblur="
var d=this.value.match(/(-?\d+)[^\d]+(\d\d?)[^\d]+(\d\d?)/)||[];
this.nextSibling.innerHTML=' Day: ' + dayNo(+d[1], +d[2], +d[3]);
" /><span></span>
<br><hr><br>
<button onclick="
var d=new Date();
this.nextSibling.innerHTML=dayNo(d.getFullYear(), d.getMonth()+1, d.getDate()) + ' Day(s)';
">get current dayno:</button><span></span>
এখানে সঠিক পরিসর-বৈধতা সহ সংস্করণ is
function dayNo(y,m,d){
return --m>=0 && m<12 && d>0 && d<29+(
4*(y=y&3||!(y%25)&&y&15?0:1)+15662003>>m*2&3
) && m*31-(m>1?(1054267675>>m*3-6&7)-y:0)+d;
}
<!-- some examples for the snippet -->
<input type=text value="(-)Y-M-D" onblur="
var d=this.value.match(/(-?\d+)[^\d]+(\d\d?)[^\d]+(\d\d?)/)||[];
this.nextSibling.innerHTML=' Day: ' + dayNo(+d[1], +d[2], +d[3]);
" /><span></span>
আবার, একটি লাইন, তবে আমি এটিকে পাঠযোগ্যতার জন্য 3 টি লাইনে বিভক্ত করেছি (এবং নিম্নলিখিত ব্যাখ্যাটি)।
উপরের ফাংশনের সাথে শেষ লাইনটি অভিন্ন, তবে (অভিন্ন) লিপইয়ার অ্যালগরিদম একটি পূর্ববর্তী শর্ট সার্কিট বিভাগে (দিন-সংখ্যা গণনার আগে) স্থানান্তরিত হয়েছে, কারণ এটিও জানতে হবে যে মাসে মাসে কত দিন রয়েছে প্রদত্ত (লিপ) বছর
মাঝের লাইনটি একটি অন্য ম্যাজিক নম্বর ব্যবহার করে প্রদত্ত (লিপ) বছরে প্রদত্ত মাসের জন্য সঠিক অফসেট নম্বর (দিনের সর্বাধিক সংখ্যার জন্য) গণনা করে: যেহেতু 31-28=3এবং 3মাত্র 2 বিট, তারপরে 12*2=24বিটস, আমরা সমস্ত 12 মাস সঞ্চয় করতে পারি। যেহেতু সংযোজন দ্রুত বিয়োগফল হতে পারে, তাই আমরা অফসেট যুক্ত করি (এটি থেকে বিয়োগের পরিবর্তে 31)। ফেব্রুয়ারির জন্য লিপ-ইয়ারের সিদ্ধান্ত-শাখা এড়াতে, আমরা ফ্লাইতে সেই ম্যাজিক লুক-নম্বরটি সংশোধন করি।
এটি আমাদের (বেশ সুস্পষ্ট) প্রথম লাইনের সাথে ছেড়ে দেয়: এটি মাস এবং তারিখটি বৈধ সীমার মধ্যে রয়েছে কিনা তা পরীক্ষা করে এবং falseপরিসীমা ত্রুটির ক্ষেত্রে একটি রিটার্ন মান সহ আমাদের নিশ্চিত করে (নোট করুন যে এই ফাংশনটিও 0 ফেরত দিতে সক্ষম হবে না, কারণ 1 জানুয়ার 0000 এখনও প্রতিদিন 1.) হল সহজ ত্রুটি পরীক্ষা উপলব্ধ করা হবে: if(r=dayNo(/*y, m, d*/)){}।
যদি এইভাবে ব্যবহার করা হয় (যেখানে মাস এবং দিন নাও থাকতে পারে 0), তবে একজন পরিবর্তিত --m>=0 && m<12হতে পারে m>0 && --m<12(অন্য চর সংরক্ষণ করা)।
এটির বর্তমান ফর্মটিতে আমি স্নিপেটটি টাইপ করার কারণটি হল 0-ভিত্তিক মাসের মানগুলির জন্য, কেবল একটি --থেকে অপসারণ করা প্রয়োজন --m।
অতিরিক্ত:
দ্রষ্টব্য, আপনার প্রতি মাসে সর্বাধিক দিনের প্রয়োজন হলে এই দিনের প্রতি মাসে অ্যালগরিদম ব্যবহার করবেন না। সেক্ষেত্রে আরও দক্ষ অ্যালগরিদম রয়েছে (কারণ আমাদের যখন ফেব্রুয়ারি মাস হয় তখনই কেবল লেপইয়ারের প্রয়োজন হয়) আমি এই প্রশ্নের উত্তর হিসাবে পোস্ট করেছি: জাভাস্ক্রিপ্ট দিয়ে মাসে একদিনের সংখ্যা নির্ধারণের সেরা উপায় কী? ।
Date.prototype.dayNo = function(){ var y = this.getFullYear(); var m = this.getMonth()+1; var d = this.getDate(); return --m*31-(m>1?(1054267675>>m*3-6&7)-(y&3||!(y%25)&&y&15?0:1):0)+d; };
+1থেকে শেভ করতে পারেন । সম্পাদনা করুন , আমি করব (একটি লাইব্রেরির জন্য):this.getMonth()+1----mDate.prototype.dayNo = function(){ var y=this.getFullYear(), m=this.getMonth(); return m*31-(m>1?(1054267675>>m*3-6&7)-(y&3||!(y%25)&&y&15?0:1):0)+this.getDate(); };
2^31 - 2016এখন থেকে আমরা বছরের পর বছরগুলিতে js সম্ভবত কিছুটা পুরানো হয়ে যাবে।
:)এটি কমপক্ষে অনুমানযোগ্য এবং ধারাবাহিক ফলাফল হাহা দেবে। এডিআইটি , কেবল তত্ত্বের স্বার্থে, লিপিয়ারের জন্য ধীরে ধীরে প্রচলিত সমস্ত-মডুলো আলগো ব্যবহার করে, পরিধিটি 2 ^ 53 পর্যন্ত বাড়ানো যেতে পারে। মাস-সন্ধানের আলগো কোনও সীমাবদ্ধ ফ্যাক্টর নয়।
ঠিক আছে, আমি যদি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনি একটি লিপ বছরে 366 চান, অন্যথায়, 365? একটি বছর একটি লিপ বছর হয় যদি এটি 4 দ্বারা সমানভাবে বিভাজ্য হয় তবে 100 দ্বারা নয় তবে এটি 400 দ্বারা বিভাজ্যও হয়:
function daysInYear(year) {
if(year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)) {
// Leap year
return 366;
} else {
// Not a leap year
return 365;
}
}
সেক্ষেত্রে আমি মনে করি না একটি অন্তর্নির্মিত পদ্ধতি আছে; আপনার এটি করতে হবে:
function daysInFebruary(year) {
if(year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)) {
// Leap year
return 29;
} else {
// Not a leap year
return 28;
}
}
function dateToDay(date) {
var feb = daysInFebruary(date.getFullYear());
var aggregateMonths = [0, // January
31, // February
31 + feb, // March
31 + feb + 31, // April
31 + feb + 31 + 30, // May
31 + feb + 31 + 30 + 31, // June
31 + feb + 31 + 30 + 31 + 30, // July
31 + feb + 31 + 30 + 31 + 30 + 31, // August
31 + feb + 31 + 30 + 31 + 30 + 31 + 31, // September
31 + feb + 31 + 30 + 31 + 30 + 31 + 31 + 30, // October
31 + feb + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31, // November
31 + feb + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30, // December
];
return aggregateMonths[date.getMonth()] + date.getDate();
}
(হ্যাঁ, আমি অনুলিপি করা বা আটকানো ছাড়া আসলে এটি করেছি। যদি কোনও সহজ উপায় থাকে তবে আমি পাগল হয়ে যাব)
:)
এটি বছরের বর্তমান দিনটি খুঁজে পাওয়ার সহজ উপায় এবং এটি কোনও সমস্যা ছাড়াই লিপ বছরের জন্য অ্যাকাউন্ট হওয়া উচিত:
javascript:
Math.round((new Date().setHours(23) - new Date(new Date().getYear()+1900, 0, 1, 0, 0, 0))/1000/60/60/24);
গুগল অ্যাপস স্ক্রিপ্টে জাভাস্ক্রিপ্ট:
Math.round((new Date().setHours(23) - new Date(new Date().getYear(), 0, 1, 0, 0, 0))/1000/60/60/24);
এই কোডের প্রাথমিক ক্রিয়াটি হ'ল চলতি বছরে যে পরিমাণ মিলি সেকেন্ড অতিবাহিত হয়েছে তার সন্ধান এবং তারপরে এই সংখ্যাটিকে কয়েক দিনের মধ্যে রূপান্তর করা। মিলি সেকেন্ড থেকে new Date(new Date().getYear()+1900, 0, 1, 0, 0, 0)(জাভাস্ক্রিপ্ট) বা new Date(new Date().getYear(), 0, 1, 0, 0, 0)(গুগল অ্যাপস স্ক্রিপ্ট) দিয়ে প্রাপ্ত বর্তমান বছরের প্রথম দিনের দ্বিতীয় সেকেন্ডের সংখ্যা বিয়োগ করে বর্তমান বছরে যে পরিমাণ মিলি সেকেন্ড অতিবাহিত হয়েছে তা পাওয়া যাবে বর্তমান দিনের 23 তম ঘন্টা, যা পাওয়া গিয়েছিল new Date().setHours(23)। বর্তমান তারিখটি ২৩ তম ঘন্টা নির্ধারণের উদ্দেশ্য হ'ল বছরের দিনটি সঠিকভাবে গোল করা নিশ্চিত করা Math.round()।
আপনার বর্তমান বছরের মিলিসেকেন্ডের সংখ্যাটি একবার হয়ে গেলে আপনি এই বারটিকে কয়েক হাজারে ভাগ করে 1000 মিলি সেকেন্ডে রূপান্তর করতে পারবেন, তারপরে 60 দ্বারা বিভক্ত হয়ে সেকেন্ডে মিনিটে রূপান্তর করতে পারবেন, তারপরে 60 দ্বারা বিভক্ত হয়ে মিনিটকে ঘন্টার মধ্যে রূপান্তর করতে পারবেন, এবং অবশেষে 24 কে ভাগ করে দিনকে দিনকে রূপান্তর করতে।
দ্রষ্টব্য: গুগল অ্যাপস স্ক্রিপ্টে প্রয়োগ করা জাভাস্ক্রিপ্ট এবং জাভাস্ক্রিপ্টের মধ্যে পার্থক্যের জন্য এই পোস্টটি সম্পাদনা করা হয়েছিল। এছাড়াও, উত্তরের জন্য আরও প্রসঙ্গ যুক্ত করা হয়েছিল।
.setHoursপ্রথম তারিখের অবজেক্টে পদ্ধতিটি ব্যবহার করেছি এবং দ্বিতীয় তারিখের অবজেক্টের সাথে দিনের সময় নির্দিষ্ট করেছি, তাই দিবালোকের সঞ্চয় সময় থেকে 1 ঘন্টা পরিবর্তন করা এই গণনায় ব্যবহৃত তারিখের অবজেক্টগুলিকে প্রভাবিত করবে না।
আমি মনে করি এটি আরও সোজা:
var date365 = 0;
var currentDate = new Date();
var currentYear = currentDate.getFullYear();
var currentMonth = currentDate.getMonth();
var currentDay = currentDate.getDate();
var monthLength = [31,28,31,30,31,30,31,31,30,31,30,31];
var leapYear = new Date(currentYear, 1, 29);
if (leapYear.getDate() == 29) { // If it's a leap year, changes 28 to 29
monthLength[1] = 29;
}
for ( i=0; i < currentMonth; i++ ) {
date365 = date365 + monthLength[i];
}
date365 = date365 + currentDay; // Done!
এই পদ্ধতিটি টাইমজোন ইস্যু এবং দিবালোক সংরক্ষণের সময় গ্রহণ করে
function dayofyear(d) { // d is a Date object
var yn = d.getFullYear();
var mn = d.getMonth();
var dn = d.getDate();
var d1 = new Date(yn,0,1,12,0,0); // noon on Jan. 1
var d2 = new Date(yn,mn,dn,12,0,0); // noon on input date
var ddiff = Math.round((d2-d1)/864e5);
return ddiff+1;
}
(থেকে গ্রহণ এখানে )
ম্যাথ.উইন্ড ((নতুন তারিখ ()। সেটহাউসস (23) - নতুন তারিখ (নতুন তারিখ ()। GetFullYear (), 0, 1, 0, 0, 0)) / 1000/86400);
আরও উত্তর অনুকূলিত করে।
তদ্ব্যতীত, সেটহাউসগুলি (23) বা শেষ-তবে-দুটি শূন্য পরে অন্য মানতে পরিবর্তন করে বছরের অন্য বছরের জন্য সময় সম্পর্কিত জোন সরবরাহ করতে পারে। উদাহরণস্বরূপ, ইউরোপ থেকে আমেরিকাতে অবস্থিত একটি সংস্থান পুনরুদ্ধার করা।
Math.floor((Date.now() - Date.parse(new Date().getFullYear(), 0, 0)) / 86400000)
এটি আমার সমাধান
আমি এমন একটি তৈরি করেছি যা পঠনযোগ্য এবং খুব দ্রুত কৌতুকটি করবে, পাশাপাশি জেএস তারিখের বিষয়গুলি পৃথক সময় অঞ্চলগুলির সাথে পরিচালনা করবে।
আমি সময় অঞ্চল, ডিএসটি, লিপ সেকেন্ড এবং লিপ বছরের জন্য বেশ কয়েকটি পরীক্ষার কেস অন্তর্ভুক্ত করেছি।
পিএস ইসিএমএ -262 ইউটিসি থেকে ভিন্ন লিপ সেকেন্ড উপেক্ষা করে। আপনি যদি সত্যিকারের ইউটিসি ব্যবহার করে এমন কোনও ভাষায় রূপান্তর করতে চান তবে আপনি কেবল 1 টিতে যুক্ত করতে পারেন oneDay।
// returns 1 - 366
findDayOfYear = function (date) {
var oneDay = 1000 * 60 * 60 * 24; // A day in milliseconds
var og = { // Saving original data
ts: date.getTime(),
dom: date.getDate(), // We don't need to save hours/minutes because DST is never at 12am.
month: date.getMonth()
}
date.setDate(1); // Sets Date of the Month to the 1st.
date.setMonth(0); // Months are zero based in JS's Date object
var start_ts = date.getTime(); // New Year's Midnight JS Timestamp
var diff = og.ts - start_ts;
date.setDate(og.dom); // Revert back to original date object
date.setMonth(og.month); // This method does preserve timezone
return Math.round(diff / oneDay) + 1; // Deals with DST globally. Ceil fails in Australia. Floor Fails in US.
}
// Tests
var pre_start_dst = new Date(2016, 2, 12);
var on_start_dst = new Date(2016, 2, 13);
var post_start_dst = new Date(2016, 2, 14);
var pre_end_dst_date = new Date(2016, 10, 5);
var on_end_dst_date = new Date(2016, 10, 6);
var post_end_dst_date = new Date(2016, 10, 7);
var pre_leap_second = new Date(2015, 5, 29);
var on_leap_second = new Date(2015, 5, 30);
var post_leap_second = new Date(2015, 6, 1);
// 2012 was a leap year with a leap second in june 30th
var leap_second_december31_premidnight = new Date(2012, 11, 31, 23, 59, 59, 999);
var january1 = new Date(2016, 0, 1);
var january31 = new Date(2016, 0, 31);
var december31 = new Date(2015, 11, 31);
var leap_december31 = new Date(2016, 11, 31);
alert( ""
+ "\nPre Start DST: " + findDayOfYear(pre_start_dst) + " === 72"
+ "\nOn Start DST: " + findDayOfYear(on_start_dst) + " === 73"
+ "\nPost Start DST: " + findDayOfYear(post_start_dst) + " === 74"
+ "\nPre Leap Second: " + findDayOfYear(pre_leap_second) + " === 180"
+ "\nOn Leap Second: " + findDayOfYear(on_leap_second) + " === 181"
+ "\nPost Leap Second: " + findDayOfYear(post_leap_second) + " === 182"
+ "\nPre End DST: " + findDayOfYear(pre_end_dst_date) + " === 310"
+ "\nOn End DST: " + findDayOfYear(on_end_dst_date) + " === 311"
+ "\nPost End DST: " + findDayOfYear(post_end_dst_date) + " === 312"
+ "\nJanuary 1st: " + findDayOfYear(january1) + " === 1"
+ "\nJanuary 31st: " + findDayOfYear(january31) + " === 31"
+ "\nNormal December 31st: " + findDayOfYear(december31) + " === 365"
+ "\nLeap December 31st: " + findDayOfYear(leap_december31) + " === 366"
+ "\nLast Second of Double Leap: " + findDayOfYear(leap_second_december31_premidnight) + " === 366"
);
আমি এমন একটি সমাধান সরবরাহ করতে চাই যা প্রতিটি আগের মাসের জন্য দিনগুলি যুক্ত করে গণনা করে:
function getDayOfYear(date) {
var month = date.getMonth();
var year = date.getFullYear();
var days = date.getDate();
for (var i = 0; i < month; i++) {
days += new Date(year, i+1, 0).getDate();
}
return days;
}
var input = new Date(2017, 7, 5);
console.log(input);
console.log(getDayOfYear(input));
এইভাবে আপনাকে লিপ বছর এবং দিবালোক সংরক্ষণের বিশদ পরিচালনা করতে হবে না।
ইউটিসি টাইমস্ট্যাম্পগুলি ব্যবহার করে একটি বিকল্প। অন্যরা যেমন উল্লেখ করেছেন যে দিনটি 1 ম মাসে 1 ই ইঙ্গিত করে 0 এর পরিবর্তে 1 হয় however তবে মাসে 0 শুরু হয়।
var now = Date.now();
var year = new Date().getUTCFullYear();
var year_start = Date.UTC(year, 0, 1);
var day_length_in_ms = 1000*60*60*24;
var day_number = Math.floor((now - year_start)/day_length_in_ms)
console.log("Day of year " + day_number);
setDateফাংশনে আপনি তারিখ নম্বর হিসাবে প্যারামিটারটি পাস করতে পারেন :
var targetDate = new Date();
targetDate.setDate(1);
// Now we can see the expected date as: Mon Jan 01 2018 01:43:24
console.log(targetDate);
targetDate.setDate(365);
// You can see: Mon Dec 31 2018 01:44:47
console.log(targetDate)
এটি তাদের জন্য কার্যকর হতে পারে যাদের স্ট্রিং হিসাবে বছরের দিন দরকার এবং jQuery UI উপলব্ধ।
আপনি jQuery UI ডেটপিকার ব্যবহার করতে পারেন:
day_of_year_string = $.datepicker.formatDate("o", new Date())
এর নীচে ইতিমধ্যে উল্লিখিত কয়েকটি উত্তর ( (date_ms - first_date_of_year_ms) / ms_per_day) হিসাবে একইভাবে কাজ করে :
function getDayOfTheYearFromDate(d) {
return Math.round((new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime()
- new Date(d.getFullYear(), 0, 0).getTime()) / 86400000);
}
day_of_year_int = getDayOfTheYearFromDate(new Date())
আমাদের মধ্যে যারা একটি দ্রুত বিকল্প সমাধান চান।
(function(){"use strict";
function daysIntoTheYear(dateInput){
var fullYear = dateInput.getFullYear()|0;
// "Leap Years are any year that can be exactly divided by 4 (2012, 2016, etc)
// except if it can be exactly divided by 100, then it isn't (2100, 2200, etc)
// except if it can be exactly divided by 400, then it is (2000, 2400)"
// (https://www.mathsisfun.com/leap-years.html).
var isLeapYear = ((fullYear & 3) | (fullYear/100 & 3)) === 0 ? 1 : 0;
// (fullYear & 3) = (fullYear % 4), but faster
//Alternative:var isLeapYear=(new Date(currentYear,1,29,12)).getDate()===29?1:0
var fullMonth = dateInput.getMonth()|0;
return ((
// Calculate the day of the year in the Gregorian calendar
// The code below works based upon the facts of signed right shifts
// • (x) >> n: shifts n and fills in the n highest bits with 0s
// • (-x) >> n: shifts n and fills in the n highest bits with 1s
// (This assumes that x is a positive integer)
(31 & ((-fullMonth) >> 4)) + // January // (-11)>>4 = -1
((28 + isLeapYear) & ((1-fullMonth) >> 4)) + // February
(31 & ((2-fullMonth) >> 4)) + // March
(30 & ((3-fullMonth) >> 4)) + // April
(31 & ((4-fullMonth) >> 4)) + // May
(30 & ((5-fullMonth) >> 4)) + // June
(31 & ((6-fullMonth) >> 4)) + // July
(31 & ((7-fullMonth) >> 4)) + // August
(30 & ((8-fullMonth) >> 4)) + // September
(31 & ((9-fullMonth) >> 4)) + // October
(30 & ((10-fullMonth) >> 4)) + // November
// There are no months past December: the year rolls into the next.
// Thus, fullMonth is 0-based, so it will never be 12 in Javascript
(dateInput.getDate()|0) // get day of the month
)&0xffff);
}
// Demonstration:
var date = new Date(2100, 0, 1)
for (var i=0; i<12; i=i+1|0, date.setMonth(date.getMonth()+1|0))
console.log(date.getMonth()+":\tday "+daysIntoTheYear(date)+"\t"+date);
date = new Date(1900, 0, 1);
for (var i=0; i<12; i=i+1|0, date.setMonth(date.getMonth()+1|0))
console.log(date.getMonth()+":\tday "+daysIntoTheYear(date)+"\t"+date);
// Performance Benchmark:
console.time("Speed of processing 65536 dates");
for (var i=0,month=date.getMonth()|0; i<65536; i=i+1|0)
date.setMonth(month=month+1+(daysIntoTheYear(date)|0)|0);
console.timeEnd("Speed of processing 65536 dates");
})();
বছরের মাসের আকার এবং লিপ ইয়ার্স যেভাবে কাজ করে তা আমাদের সময়কে সূর্যের সাথে ট্র্যাক করে রাখতে পুরোপুরি ফিট করে। হেক, এটি এত নিখুঁতভাবে কাজ করে যে আমরা যা করি তা হ'ল এখানে এবং সেখানে কেবল কয়েক সেকেন্ড সামঞ্জস্য । আমাদের লিপ বছরের বর্তমান ব্যবস্থাটি ফেব্রুয়ারি 24, 1582 থেকে কার্যকর হয়েছে এবং সম্ভবত ভবিষ্যতের জন্য কার্যকর থাকবে।
ডিএসটি তবে পরিবর্তনের বিষয়। এটি হতে পারে যে এখন থেকে 20 বছর পরে, কোনও কোনও দেশ পুরো দিন বা ডিএসটি-র জন্য অন্য কোনও চরম সময়ের দ্বারা অফসেট দিতে পারে। একটি সম্পূর্ণ ডিএসটি দিন অবশ্যই কখনই ঘটবে না, তবে ডিএসটি তবুও খুব বায়ুমণ্ডল এবং দ্বিধাহীন is সুতরাং, উপরের সমাধানটি খুব দ্রুত হওয়া ছাড়াও ভবিষ্যতের প্রমাণ।
উপরের কোড স্নিপেট খুব দ্রুত চলে। আমার কম্পিউটার Chrome এ 525 ডলারে 65536 তারিখগুলি প্রক্রিয়া করতে পারে।
const dayOfYear = date => {
const myDate = new Date(date);
const year = myDate.getFullYear();
const firstJan = new Date(year, 0, 1);
const differenceInMillieSeconds = myDate - firstJan;
return (differenceInMillieSeconds / (1000 * 60 * 60 * 24) + 1);
};
const result = dayOfYear("2019-2-01");
console.log(result);
এটি এমন একটি সমাধান যা সমস্যাজনক তারিখ অবজেক্ট এবং টাইমজোন সমস্যাগুলি এড়ায়, এটির জন্য আপনার ইনপুট তারিখটি "yyyy-dd-mm" ফর্ম্যাটে থাকা দরকার। আপনি যদি ফর্ম্যাটটি পরিবর্তন করতে চান তবে তারিখ_স্ট্রিটো_পরিষ্কার কার্য সম্পাদনা করুন:
function get_day_of_year(str_date){
var date_parts = date_str_to_parts(str_date);
var is_leap = (date_parts.year%4)==0;
var acct_for_leap = (is_leap && date_parts.month>2);
var day_of_year = 0;
var ary_months = [
0,
31, //jan
28, //feb(non leap)
31, //march
30, //april
31, //may
30, //june
31, //july
31, //aug
30, //sep
31, //oct
30, //nov
31 //dec
];
for(var i=1; i < date_parts.month; i++){
day_of_year += ary_months[i];
}
day_of_year += date_parts.date;
if( acct_for_leap ) day_of_year+=1;
return day_of_year;
}
function date_str_to_parts(str_date){
return {
"year":parseInt(str_date.substr(0,4),10),
"month":parseInt(str_date.substr(5,2),10),
"date":parseInt(str_date.substr(8,2),10)
}
}
তারিখ ফাংশনগুলির সাথে গণিতের মিশ্রণ করার সময় এটি সর্বদা আমাকে চিন্তিত করে তোলে (কিছু লিপ বছরের অন্যান্য বিবরণ মিস করা এত সহজ)। বলুন আপনার আছে:
var d = new Date();
আমি নিম্নলিখিতটি ব্যবহার করে পরামর্শ দেব, দিনগুলি এতে সংরক্ষণ করা হবে day:
for(var day = d.getDate(); d.getMonth(); day += d.getDate())
d.setDate(0);
কেন এটি ঠিকঠাক কাজ করবে না তার কোনও কারণ দেখতে পাচ্ছেন না (এবং আমি কয়েকটি পুনরাবৃত্তির বিষয়ে এতটা উদ্বিগ্ন হব না যেহেতু এটি এত নিবিড়ভাবে ব্যবহার করা হবে না)।
/ * এই স্ক্রিপ্টটি ব্যবহার করুন * /
var today = new Date();
var first = new Date(today.getFullYear(), 0, 1);
var theDay = Math.round(((today - first) / 1000 / 60 / 60 / 24) + .5, 0);
alert("Today is the " + theDay + (theDay == 1 ? "st" : (theDay == 2 ? "nd" : (theDay == 3 ? "rd" : "th"))) + " day of the year");
var days = new Date().getFullYear() % 4 == 0 ? 366 : 365;