ilib
Version:
iLib is a cross-engine library of internationalization (i18n) classes written in pure JS
1 lines • 5.51 kB
JavaScript
var ilib=require("./ilib.js");var JSUtils=require("./JSUtils.js");var MathUtils=require("./MathUtils.js");var Locale=require("./Locale.js");var LocaleInfo=require("./LocaleInfo.js");var IDate=require("./IDate.js");var TimeZone=require("./TimeZone.js");var Calendar=require("./Calendar.js");var Astro=require("./Astro.js");var HanCal=require("./HanCal.js");var GregorianDate=require("./GregorianDate.js");var HanRataDie=require("./HanRataDie.js");var RataDie=require("./RataDie.js");var HanDate=function(e){this.timezone="local";if(e){if(e.locale){this.locale=typeof e.locale==="string"?new Locale(e.locale):e.locale;var a=new LocaleInfo(this.locale);this.timezone=a.getTimeZone()}if(e.timezone){this.timezone=e.timezone}}new HanCal({sync:e&&typeof e==="boolean"?e.sync:true,loadParams:e&&e.loadParams,callback:ilib.bind(this,function(a){this.cal=a;if(e&&(e.year||e.month||e.day||e.hour||e.minute||e.second||e.millisecond||e.cycle||e.cycleYear)){if(typeof e.cycle!=="undefined"){this.cycle=parseInt(e.cycle,10)||0;var t=(typeof e.year!=="undefined"?parseInt(e.year,10):parseInt(e.cycleYear,10))||0;this.year=HanCal._getElapsedYear(t,this.cycle)}else{if(typeof e.year!=="undefined"){this.year=parseInt(e.year,10)||0;this.cycle=Math.floor((this.year-1)/60)}else{this.year=this.cycle=0}}this.month=parseInt(e.month,10)||1;this.day=parseInt(e.day,10)||1;this.hour=parseInt(e.hour,10)||0;this.minute=parseInt(e.minute,10)||0;this.second=parseInt(e.second,10)||0;this.millisecond=parseInt(e.millisecond,10)||0;this.cycleYear=MathUtils.amod(this.year,60);this.dayOfYear=parseInt(e.dayOfYear,10);if(typeof e.dst==="boolean"){this.dst=e.dst}this.newRd({cal:this.cal,cycle:this.cycle,year:this.year,month:this.month,day:this.day,hour:this.hour,minute:this.minute,second:this.second,millisecond:this.millisecond,sync:e&&typeof e.sync==="boolean"?e.sync:true,loadParams:e&&e.loadParams,callback:ilib.bind(this,function(a){if(a){this.rd=a;if(!this.tz){this.tz=new TimeZone({id:this.timezone})}this.offset=this.tz._getOffsetMillisWallTime(this)/864e5;if(this.offset!==0){this.rd=this.newRd({cal:this.cal,rd:this.rd.getRataDie()-this.offset});this._calcLeap()}else{this.leapMonth=this.rd.leapMonth;this.priorLeapMonth=this.rd.priorLeapMonth;this.leapYear=this.rd.leapYear}}if(!this.rd){this.rd=this.newRd(JSUtils.merge(e||{},{cal:this.cal}));this._calcDateComponents()}if(e&&typeof e.onLoad==="function"){e.onLoad(this)}})})}else{if(!this.rd){this.rd=this.newRd(JSUtils.merge(e||{},{cal:this.cal}));this._calcDateComponents()}if(e&&typeof e.onLoad==="function"){e.onLoad(this)}}})})};HanDate.prototype=new IDate({noinstance:true});HanDate.prototype.parent=IDate;HanDate.prototype.constructor=HanDate;HanDate.prototype.newRd=function(e){return new HanRataDie(e)};HanDate.prototype._calcYear=function(e){var a=new GregorianDate({rd:e,timezone:this.timezone});var t=a.year+2697;var r=this.cal.newYears(t);return t-(e+RataDie.gregorianEpoch<r?1:0)};HanDate.prototype._calcLeap=function(){var e=this.rd.getRataDie()+RataDie.gregorianEpoch;var a=HanCal._leapYearCalc(this.year);var t=HanCal._newMoonOnOrAfter(a.m1+1);this.leapYear=Math.round((a.m2-a.m1)/29.530588853)===12;var r=this.leapYear&&(HanCal._noMajorST(a.m1)||HanCal._noMajorST(t))?HanCal._newMoonOnOrAfter(t+1):t;var i=HanCal._newMoonBefore(e+1);this.priorLeapMonth=HanRataDie._priorLeapMonth(r,HanCal._newMoonBefore(i));this.leapMonth=this.leapYear&&HanCal._noMajorST(i)&&!this.priorLeapMonth};HanDate.prototype._calcDateComponents=function(){var e,a=this.rd.getRataDie()+RataDie.gregorianEpoch;if(typeof this.offset==="undefined"){if(!this.tz){this.tz=new TimeZone({id:this.timezone})}this.offset=this.tz.getOffsetMillis(this)/864e5}if(this.offset!==0){a+=this.offset}var t=GregorianDate._calcYear(this.rd.getRataDie());this.year=t+2697;var r=HanCal._leapYearCalc(this.year);var i=HanCal._newMoonOnOrAfter(r.m1+1);this.leapYear=Math.round((r.m2-r.m1)/29.530588853)===12;var n=this.leapYear&&(HanCal._noMajorST(r.m1)||HanCal._noMajorST(i))?HanCal._newMoonOnOrAfter(i+1):i;if(a<n){this.year--;r=HanCal._leapYearCalc(this.year);i=HanCal._newMoonOnOrAfter(r.m1+1);this.leapYear=Math.round((r.m2-r.m1)/29.530588853)===12;n=this.leapYear&&(HanCal._noMajorST(r.m1)||HanCal._noMajorST(i))?HanCal._newMoonOnOrAfter(i+1):i}var o=HanCal._newMoonBefore(a+1);this.month=Math.round((o-r.m1)/29.530588853);this.priorLeapMonth=HanRataDie._priorLeapMonth(n,HanCal._newMoonBefore(o));this.leapMonth=this.leapYear&&HanCal._noMajorST(o)&&!this.priorLeapMonth;this.cycle=Math.floor((this.year-1)/60);this.cycleYear=MathUtils.amod(this.year,60);this.day=Astro._floorToJD(a)-o+1;e=a-Astro._floorToJD(a);e=Math.round(e*864e5);this.hour=Math.floor(e/36e5);e-=this.hour*36e5;this.minute=Math.floor(e/6e4);e-=this.minute*6e4;this.second=Math.floor(e/1e3);e-=this.second*1e3;this.millisecond=e};HanDate.prototype.getCycleYears=function(){return this.cycleYear};HanDate.prototype.getCycles=function(){return this.cycle};HanDate.prototype.isLeapYear=function(){return this.leapYear};HanDate.prototype.isLeapMonth=function(){return this.leapMonth};HanDate.prototype.getDayOfWeek=function(){var e=Math.floor(this.rd.getRataDie()+(this.offset||0));return MathUtils.mod(e,7)};HanDate.prototype.getDayOfYear=function(){var e=this.cal.newYears(this.year);var a=HanCal._newMoonOnOrAfter(e+(this.month-1)*29);return a-e+this.day};HanDate.prototype.getEra=function(){return this.year<1?-1:1};HanDate.prototype.getCalendar=function(){return"han"};IDate._constructors["han"]=HanDate;module.exports=HanDate;