জাভাস্ক্রিপ্ট বছরের দিন গণনা (1 - 366)


119

আমি 1 - 366 থেকে বছরের দিন গণনা করতে জাভাস্ক্রিপ্ট কীভাবে ব্যবহার করব? উদাহরণ স্বরূপ:

  • জানুয়ারী 3 হতে হবে 3
  • 1 ফেব্রুয়ারি 32 হওয়া উচিত ।

4
var days = new Date().getFullYear() % 4 == 0 ? 366 : 365;
অ্যালেক্স তুরপিন

তবে সত্যই আমি নিশ্চিত আপনি কি বলতে চাইছেন না। আপনি শুধু বছরের সংখ্যা কত চান? নাকি দুটি তারিখের মধ্যে?
অ্যালেক্স তুরপিন

16
FYI @ xeon06, অধিবর্ষ গণনা করা হয় একটু 4. দ্বারা mod'ing চেয়েও বেশি জটিল দেখুন: লীপ ইয়ার অ্যালগরিদম
ম্যাট Felzani

4
@ Xeon06: এটি বেশিরভাগ সময় সঠিক। থেকে উইকিপিডিয়া : বছর যে সমানভাবে 100 দ্বারা বিভাজ্য হয় বছর লিপ করা হয় না, যদি না তারা সমানভাবে 400 দ্বারা বিভাজ্য হয়, যে ক্ষেত্রে তারা হয় অধিবর্ষ।
ক্যামেরন

আহ ভাল আমি সংশোধন দাঁড়িয়ে। @ মিনিটেকের তখন সঠিক উত্তর আছে বলে মনে হচ্ছে।
অ্যালেক্স টারপিন

উত্তর:


138

ওপি'র সম্পাদনা অনুসরণ করছেন:

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);


5
Math.floorধারাবাহিকভাবে আমাকে এপ্রিলের নির্দিষ্ট দিনের পরে প্রত্যাশার চেয়ে 1 দিন কম ফলাফল দেয়। Math.ceilপ্রত্যাশার মতো কাজ করেছেন, তবে আমি দেখেছি যে আপনি যে Math.roundকোনও একটির পরিবর্তে ব্যবহার করুন।
baacke

3
দিনের উপাদানটি বেস -1। অর্থাত্ এই বছরের ১ লা জানুয়ারী উপস্থাপন করার জন্য, আপনি এখানে ব্যবহার করেন new Date(2014, 0, 1)এবং এটি ব্যবহার করেন না new Date(2014, 0, 0)। এটা কি ইচ্ছাকৃত? সম্ভবত এক দিন বন্ধ হয়ে যাওয়ার জন্য অ্যাকাউন্টগুলি new Date(2014, 0, 0)ফিরে আসবে 12/31/2013
কার্ক ওল

1
সম্ভবত ব্যবহার করুন .setUTCHoursএবং Date.UTC()আরও নির্ভরযোগ্য সমাধানের জন্য।
ন্যো

6
@ অ্যালেক্সটুরপিন, @ টি 30: আমি জানি এটি কিছুটা পুরানো, তবে আপনি যদি ভাবছিলেন ... মার্চ মাসে দিবালোক সঞ্চয় সময় শুরুর কারণে সমস্যা দেখা দিয়েছে। এটি কারণ আপনি যখন ডিএসটি এর আগে কোনও তারিখের মধ্যরাত এবং ডিএসটি পরে একটি তারিখের মধ্যরাতের পার্থক্যটি গ্রহণ করেন আপনার কাছে 1000 * 60 * 60 * 24 দ্বারা সমানভাবে বিভাজ্য সংখ্যক মিলিসেকেন্ড থাকবে না (এটি ঠিক এক ঘন্টা বন্ধ হবে) । এর ceilচেয়ে সহজ সমাধানটি এর পরিবর্তে ব্যবহার করা floor, এটি আপনাকে এমন একটি সংখ্যক সিস্টেম দেবে যেখানে জানুয়ারি 1 = 1 আপনি যদি 1 লা জানুয়ারী (0 floor) আপনাকে চান তবে আপনার চূড়ান্ত ফলাফল থেকে 1 টি বিয়োগ করুন।
ওয়ারেন আর

2
সময় অঞ্চল এবং দিবালোকের সঞ্চয়গুলি অ্যাকাউন্টে নিতে, 3 থেকে লাইনটি পরিবর্তন করুন: var diff = now - start + (start.getTimezoneOffset() - now.getTimezoneOffset()) * 60 * 1000;
মারলন

46

এটি সমস্ত দেশে দিবালোক সঞ্চয় সময় পরিবর্তন জুড়ে কাজ করে (উপরের "দুপুর" অস্ট্রেলিয়ায় কাজ করে না):

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;
};

1
সম্মত হন যে গৃহীত উত্তরে দিবালোকের সঞ্চয় সম্পর্কিত বাগ রয়েছে। উপরের সমাধানটি আরও ভাল এবং দ্রুত। এখানে এর বিভিন্নতা আমি jsLive jsperf.com/date-getdayofyear-perf- এ
শ্যাম

@ শ্যামহবরকদা: আপনার বেঞ্চমার্কের কোডটি ভেঙে গেছে, getDay()এটিকে পরিবর্তন করতে হবে getDate()। প্রাক্তন সপ্তাহের দিনটি (0 = রবিবার..6 = শনিবার) ফেরায়, দিনটি নয়।
কোডম্যানএক্স

32

আমি এটি খুব আকর্ষণীয় মনে করি যে কেউ ইউটিসি ব্যবহারের বিষয়টি বিবেচনা করে না কারণ এটি ডিএসটি সাপেক্ষে নয়। অতএব, আমি নিম্নলিখিত প্রস্তাব:

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

এটি উপচে পড়তে পারে কারণ মিলিসেকেন্ডের সংখ্যা খুব বেশি।
knt5784

@ knt5784 গণিতটি উপচে পড়তে সক্ষম হতে পারে, তবে তার উদাহরণটি দেখায় যে বৃহত্তম সম্ভাব্য রিয়েল-ওয়ার্ল্ড মান ভাল কাজ করছে যাতে আপনার পূর্ণরূপের ওভারফ্লো নিয়ে ব্রাউজার ভিত্তিক সমস্যা না থাকলে এটি ব্যবহার করা উচিত।
প্রতি ফাগ্রেল

আমি ব্যক্তিগতভাবে এই পদ্ধতির পছন্দ করি। ডিএসটি সমস্যাগুলি এড়াতে অনেক ক্লিনার (এবং খুব চালাক!) উপায়। কেউ যদি ডিওওয়াই থেকে ডেটে কীভাবে রূপান্তর করবেন তা ভাবছেন, এটি অনেক সহজ। মূলত, আপনি কেবল জানুয়ারী ডিওওয়াইথের একটি তারিখ তৈরি করেন। উদাহরণস্বরূপ, ৫ জানুয়ারী === ২৮ ফেব্রুয়ারি Le function doyToDate(doy, year) { return new Date(year, 0, doy); }
কিপ করুন

@ knt5784 এই কোডটির সাথে মিলিসেকেন্ড ওভারফ্লো হওয়ার ঝুঁকি নেই, কমপক্ষে আরও 200,000 বছর ধরে নয়। তারিখ দ্বারা সমর্থিত বৃহত্তম তারিখটি new Date(8640000000000000), যা এখনও কম Number.MAX_SAFE_INTEGER। এই উত্তরটি দেখুন: stackoverflow.com/a/11526569/18511
কিপ করুন

18
Date.prototype.dayOfYear= function(){
    var j1= new Date(this);
    j1.setMonth(0, 0);
    return Math.round((this-j1)/8.64e7);
}

alert(new Date().dayOfYear())

3
এটি লিঙ্কটি পাস করবে না ... কোনও জিনিস যা আপনার নয়, বিশেষত একটি বিশ্বব্যাপী Mod এটি চরম ঝুঁকির সাথে গ্রহগুলিতেও ব্যর্থ হয় যেখানে দিনের আলোর সঞ্চয়ের সময় 12 ঘন্টাের বেশি হয়। তবে আরও বাস্তবে, আপনি যদি এমন কোনও ব্রাউজারের কোডিং করছেন যা তারিখের অবজেক্টের সময় অঞ্চল পরিবর্তন করতে দেয়, জে 1 এর টাইমজোনটি অস্ট্রেলিয়া হতে পারে এবং এই সময়সীমাটি আলাস্কা হতে পারে, গোলটি ভেঙে।
রায় ফস 15

11

ভাগ্যক্রমে এই প্রশ্নের উত্তর দেয় না যে বর্তমান দিনের নম্বর প্রয়োজন কিনা তা নির্দিষ্ট করে না ।
এছাড়াও কিছু উত্তরে (অন্যান্য প্রশ্নেও) লিপ-ইয়ার সমস্যা ছিল বা ডেট-অবজেক্ট ব্যবহার করা হয়েছিল। যদিও জাভাস্ক্রিপ্টের Date objectকভারেজ প্রায় ২৮৫6১ years বছর (১,০০,০০,০০০ দিন) একদিকে জানুয়ারী ১, ১৯ of০ এর উভয় দিকে, আমি বিভিন্ন ব্রাউজারগুলিতে সমস্ত ধরণের অপ্রত্যাশিত তারিখের অসঙ্গতিতে বিরক্ত হয়েছি (বেশিরভাগ ক্ষেত্রে বছর 0 থেকে 99)। আমি কীভাবে এটি হিসাব করব তা জানতে আগ্রহী ছিলাম।

তাই আমি সঠিক ( প্রলেপটিক গ্রেগরিয়ান / অ্যাস্ট্রোনমিক্যাল / আইএসও 8601: 2004 (ধারা ৪.৩.২.১) গণনা করার জন্য একটি সহজ এবং সর্বোপরি ছোট অ্যালগরিদম লিখেছি , সুতরাং বছরটি বিদ্যমান এবং এটি একটি লিপ বছর এবং নেতিবাচক বছরগুলি সমর্থিত ) বছরের দিন উপর ভিত্তি করে বছর , মাস এবং দিন । উল্লেখ্য যে শিরোনামে, বছর 0 খ্রিস্টাব্দ / বিসি বিদ্যমান নেই: পরিবর্তে বছরটি লিপ-বছর! আপনার যদি খ্রিস্টপূর্ব স্বরলিপিটির জন্য অ্যাকাউন্ট প্রয়োজন হয় তবে কেবলমাত্র (অন্যথায় ইতিবাচক) বছরের মূল্যবোধের এক বছর আগে বিয়োগ করুন !! 0
AD/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

অতিরিক্ত:
দ্রষ্টব্য, আপনার প্রতি মাসে সর্বাধিক দিনের প্রয়োজন হলে এই দিনের প্রতি মাসে অ্যালগরিদম ব্যবহার করবেন না। সেক্ষেত্রে আরও দক্ষ অ্যালগরিদম রয়েছে (কারণ আমাদের যখন ফেব্রুয়ারি মাস হয় তখনই কেবল লেপইয়ারের প্রয়োজন হয়) আমি এই প্রশ্নের উত্তর হিসাবে পোস্ট করেছি: জাভাস্ক্রিপ্ট দিয়ে মাসে একদিনের সংখ্যা নির্ধারণের সেরা উপায় কী?


1
আমি এটিকে ব্যবহারের সহজতার জন্য একটি তারিখ ফাংশনে ফেলে দিয়েছি। অনুমোদিত তারিখ () অসঙ্গতিগুলি এখনও একটি সমস্যা, তবে আমি বছর 2015+ ব্যবহার করছি তাই আমি আশা করি যে তারা ধারাবাহিক are দরিদ্র জেএসহিন্ট আপনার কোড হাহাহ বৈধ করার চেষ্টা করে মারা গেল died 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; };
ফ্রেশভোক

আনন্দিত আপনি এটা পছন্দ করেছেন. এই আলগোটি সম্পূর্ণরূপে 2 ^ 31-1 বছর ধরে পরীক্ষা করা হয়েছে (পুরো 2147483647, এটি> জাভাস্ক্রিপ্টের তারিখ-অবজেক্টের 7500 গুণ গুনে) 0 এর উভয় পক্ষেই (এটি 2 ^ 32 এর জন্য কার্যকর হতে পারে , তবে আমি এটি পরীক্ষা করেছি না) এখনো). এছাড়াও, আপনি আমার উত্তরটি আবার পড়তে পারেন: আপনি যদি এর থেকে সরিয়ে দেন তবে আপনি এ +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 পর্যন্ত বাড়ানো যেতে পারে। মাস-সন্ধানের আলগো কোনও সীমাবদ্ধ ফ্যাক্টর নয়।
গীতরল্যাব

5

আপনি যদি চাকাটি পুনরায় উদ্ভাবন করতে না চান, আপনি দুর্দান্ত তারিখ-fns ( নোড.জেএস ) লাইব্রেরিটি ব্যবহার করতে পারেন :

var getDayOfYear = require('date-fns/get_day_of_year')

var dayOfYear = getDayOfYear(new Date(2017, 1, 1)) // 1st february => 32

4

ঠিক আছে, আমি যদি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনি একটি লিপ বছরে 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();
}

(হ্যাঁ, আমি অনুলিপি করা বা আটকানো ছাড়া আসলে এটি করেছি। যদি কোনও সহজ উপায় থাকে তবে আমি পাগল হয়ে যাব)


আমার সহজ উপায়টি কেবল 1054267675 যাদু নম্বর ব্যবহার করছে এবং এটিকে একটি দিন কল করে, আমি সমস্ত টাইপ করতে অলস উপায় করছি:)
গীতাআরএলএবি

4

এটি বছরের বর্তমান দিনটি খুঁজে পাওয়ার সহজ উপায় এবং এটি কোনও সমস্যা ছাড়াই লিপ বছরের জন্য অ্যাকাউন্ট হওয়া উচিত:

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 কে ভাগ করে দিনকে দিনকে রূপান্তর করতে।

দ্রষ্টব্য: গুগল অ্যাপস স্ক্রিপ্টে প্রয়োগ করা জাভাস্ক্রিপ্ট এবং জাভাস্ক্রিপ্টের মধ্যে পার্থক্যের জন্য এই পোস্টটি সম্পাদনা করা হয়েছিল। এছাড়াও, উত্তরের জন্য আরও প্রসঙ্গ যুক্ত করা হয়েছিল।


আপনি দয়া করে এটি কাজ করে বলার চেয়ে আরও কিছুটা ব্যাখ্যা করতে পারেন?
স্টিফেন রিইন্ডল

হ্যাঁ! আমি প্রথমে আরও বিশদ না দেওয়ার জন্য দুঃখিত। "ম্যাথ.গ্রাউন্ড" বিবৃতিটির অভ্যন্তরের অভিব্যক্তি বছরের বর্তমান দিনের শেষ ঘন্টাের মিলি সেকেন্ড থেকে বছরের প্রথম দিনটি বিয়োগ করে বর্তমান বছরের মিলিসেকেন্ডগুলির সন্ধান করে। মিলিসেকেন্ডের সংখ্যাটি তখন 1000 দ্বারা বিভক্ত হয়ে সেকেন্ডে রূপান্তরিত হয়, 60 মিনিটে রূপান্তরিত হয়, 60 ঘন্টাকে রূপান্তরিত হয় এবং 24 দিনগুলিতে রূপান্তরিত হয়। এক্সপ্রেশনটি "ম্যাথ.াউন্ড ()" ফাংশনের মধ্যে আবৃত থাকে যাতে এটি বছরের দিনের জন্য একটি পূর্ণসংখ্যার সাথে ঘুরতে থাকে।
লিজ পেজ-গোল্ড

আমার আরও যোগ করা উচিত যে এই সমাধানটি মূলত "গৃহীত" সমাধানের সমান, এটি কোডের এক লাইনে সবকিছু না করে।
লিজ পেজ-গোল্ড

দিবালোক সঞ্চয় সময়ের জন্য এই অ্যাকাউন্টটি কীভাবে হয়? এটা কি কিছুটা ফেলে দেবে না?
ড্যান ওসওয়াল্ট

না, দিবালোক সঞ্চয়ের সময় এই গণনার উপর প্রভাব ফেলবে না, কারণ দিবালোক সঞ্চয়ের সময়টির সমাধানের সময় কয়েক ঘন্টা থাকে এবং এই কোডটি বছরের বেশিরভাগ দিনের সংখ্যা গণনা করে। তদুপরি, আমি .setHoursপ্রথম তারিখের অবজেক্টে পদ্ধতিটি ব্যবহার করেছি এবং দ্বিতীয় তারিখের অবজেক্টের সাথে দিনের সময় নির্দিষ্ট করেছি, তাই দিবালোকের সঞ্চয় সময় থেকে 1 ঘন্টা পরিবর্তন করা এই গণনায় ব্যবহৃত তারিখের অবজেক্টগুলিকে প্রভাবিত করবে না।
লিজ পেজ-গোল্ড

4

আমি মনে করি এটি আরও সোজা:

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!

3

এই পদ্ধতিটি টাইমজোন ইস্যু এবং দিবালোক সংরক্ষণের সময় গ্রহণ করে

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; 
}

(থেকে গ্রহণ এখানে )

এই কোলাহলটি দেখুন


এটি কিছুটা অক্ষম তবে এটি পুরোপুরি কার্যকর। আপনি কেবলমাত্র অবজেক্টগুলির জন্য সময় পেতে পারেন এবং তারিখটি তারিখটি পরিবর্তন করে দিন ১. উভয়ই পুরোপুরি সমর্থিত। ধারণাটি হ'ল আপনি সময় অঞ্চল ঘুরে বেড়াবেন না। এটি ধরেও নিয়েছে যে দিবালোকের সঞ্চয় সময় 12 ঘন্টােরও কম হয় ... যা পৃথিবীতে একটি নিরাপদ অনুমান।
রে ফোস

2

ম্যাথ.উইন্ড ((নতুন তারিখ ()। সেটহাউসস (23) - নতুন তারিখ (নতুন তারিখ ()। GetFullYear (), 0, 1, 0, 0, 0)) / 1000/86400);

আরও উত্তর অনুকূলিত করে।

তদ্ব্যতীত, সেটহাউসগুলি (23) বা শেষ-তবে-দুটি শূন্য পরে অন্য মানতে পরিবর্তন করে বছরের অন্য বছরের জন্য সময় সম্পর্কিত জোন সরবরাহ করতে পারে। উদাহরণস্বরূপ, ইউরোপ থেকে আমেরিকাতে অবস্থিত একটি সংস্থান পুনরুদ্ধার করা।


1
Math.floor((Date.now() - Date.parse(new Date().getFullYear(), 0, 0)) / 86400000)

এটি আমার সমাধান


আমি আগের বছরের ৩১ শে ডিসেম্বরে জানুয়ারী ০১ = ডওয়াই 01 করার জন্য ব্যবহার করেছি Also এছাড়াও আমি দেখতে পেলাম যে মার্চ 10 তে 11 ই মার্চের সমান ডিওওয়াই রয়েছে কারণ একটি ছিল 69 এবং অন্যটি 69.9 কিছু ছিল both 69 তে ফ্লোরিং instead পরিবর্তে ম্যাথ.গ্রাউন্ড করা এটি ঠিক করেছে । আমি বিশ্বাস করি 10 মার্চ বা 11 মার্চ পারেন দিবালোক সংরক্ষণ সময় সুইচ যা মার্চ 11 বেশ হবে না কারণ হয় DOY 70.
user3015682

0

আমি এমন একটি তৈরি করেছি যা পঠনযোগ্য এবং খুব দ্রুত কৌতুকটি করবে, পাশাপাশি জেএস তারিখের বিষয়গুলি পৃথক সময় অঞ্চলগুলির সাথে পরিচালনা করবে।

আমি সময় অঞ্চল, ডিএসটি, লিপ সেকেন্ড এবং লিপ বছরের জন্য বেশ কয়েকটি পরীক্ষার কেস অন্তর্ভুক্ত করেছি।

পিএস ইসিএমএ -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"
);


0

আমি এমন একটি সমাধান সরবরাহ করতে চাই যা প্রতিটি আগের মাসের জন্য দিনগুলি যুক্ত করে গণনা করে:

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));

এইভাবে আপনাকে লিপ বছর এবং দিবালোক সংরক্ষণের বিশদ পরিচালনা করতে হবে না।


0

ইউটিসি টাইমস্ট্যাম্পগুলি ব্যবহার করে একটি বিকল্প। অন্যরা যেমন উল্লেখ করেছেন যে দিনটি 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);

0

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)

0

এটি তাদের জন্য কার্যকর হতে পারে যাদের স্ট্রিং হিসাবে বছরের দিন দরকার এবং 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())

0

আমাদের মধ্যে যারা একটি দ্রুত বিকল্প সমাধান চান।

(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 তারিখগুলি প্রক্রিয়া করতে পারে।


0

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);


0

এটি এমন একটি সমাধান যা সমস্যাজনক তারিখ অবজেক্ট এবং টাইমজোন সমস্যাগুলি এড়ায়, এটির জন্য আপনার ইনপুট তারিখটি "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)
    }
}

-1

তারিখ ফাংশনগুলির সাথে গণিতের মিশ্রণ করার সময় এটি সর্বদা আমাকে চিন্তিত করে তোলে (কিছু লিপ বছরের অন্যান্য বিবরণ মিস করা এত সহজ)। বলুন আপনার আছে:

var d = new Date();

আমি নিম্নলিখিতটি ব্যবহার করে পরামর্শ দেব, দিনগুলি এতে সংরক্ষণ করা হবে day:

for(var day = d.getDate(); d.getMonth(); day += d.getDate())
    d.setDate(0);

কেন এটি ঠিকঠাক কাজ করবে না তার কোনও কারণ দেখতে পাচ্ছেন না (এবং আমি কয়েকটি পুনরাবৃত্তির বিষয়ে এতটা উদ্বিগ্ন হব না যেহেতু এটি এত নিবিড়ভাবে ব্যবহার করা হবে না)।


-1

/ * এই স্ক্রিপ্টটি ব্যবহার করুন * /

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");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.