====== Date Difference demo ====== This demo uses the UIExtras plugin, which is not free. You can buy it outright or you can use it for free if you have a Premium subscription. ===== What can I learn from this sample? ===== The main subjects explored in this demo are * Changing layout when the screen rotates * Calculating the difference between two dates in years, months and days. ===== What if I don't have the plugin? ===== Of course you could always buy it or take out a Premium subscription. Alternatively, you can study the code and pick out any bits you want. Or you can remove the UIExtras stuff and replace it with your own controls (TextEdits?) to allow the user to input a date. ===== The code ===== // DroidScript // needs UIExtras plugin to run without modification // // tries to handle screen rotation helpfully // by placing controls vertically or horizontally // as appropriate. This does not rely on the plugin // the dateDiff function does not rely on the plugin app.LoadPlugin( "UIExtras" ); var date1,date2; var picker,picker2,lay,txt,txt2,mth={};; function OnStart() { setMth(mth); var orient = app.GetOrientation()=="Landscape"?"Horizontal":"Verical"; lay = app.CreateLayout( "Linear", orient+",FillXY" ); var lay1 = app.CreateLayout( "Linear", "" ); var lay2 = app.CreateLayout( "Linear", "" ); lay.AddChild( lay1 ); lay.AddChild( lay2 ); if(app.GetOrientation=="Landscape") lay.SetOrientation( "Horizontal" ); var uix = app.CreateUIExtras(); picker = uix.CreateDatePicker(); picker.SetOnDateChanged( OnDateChanged ); lay1.AddChild( picker ); txt= app.CreateText( "",-1,-1,"autoscale" ); txt.SetTextSize( 32 ); txt.SetOnTouchUp( txt_OnTouch ); lay1.AddChild( txt ); picker2 = uix.CreateDatePicker(); picker2.SetOnDateChanged( OnDate2Changed ); lay2.AddChild( picker2 ); txt2= app.CreateText( "",-1,-1,"autoscale" ); txt2.SetTextSize( 32 ); lay2.AddChild( txt2 ); app.AddLayout( lay ); init() } function txt_OnTouch() { if(confirm("Reset dates?")) init(); } function init() { var date = new Date(); date1 = new Date(date.getFullYear(),date.getMonth(),date.getDate()); //date2 = new Date(date.getFullYear(),date.getMonth(),(date.getDate()+7)); date2 = new Date(2019, mth.jan, 1); picker.SetDate(date1); picker2.SetDate(date2); showDiff(); } function OnDateChanged( year, month, day ) { date1 = new Date( year, month, day); showDiff(); } function OnDate2Changed( year, month, day ) { date2 = new Date( year, month, day); showDiff(); } // something changed, update text. function showDiff() { var d = 1000*3600*24; var diff = Math.round((date2.getTime() - date1.getTime())/d); txt.SetText( diff + " days" ); txt.SetTextSize( 32 ); // may have been undone by autoscale var diffObj = dateDiff(date1,date2); var s = diffObj.sign; if(diffObj.years > 0) s += diffObj.years+" years, " if(diffObj.months > 0) s += diffObj.months+" months, " s += diffObj.days+" days" txt2.SetText( s ); txt2.SetTextSize( 32 );// may have been undone by autoscale } // lazy way to choose month when using Date object function setMth(m) { m.jan=0; m.feb=1; m.mar=2; m.apr=3; m.may=4; m.jun=5; m.jul=6; m.aug=7; m.sep=8; m.oct=9; m.nov=10; m.dec=11; } // screen orientation has probably changed function OnConfig() { if(app.GetOrientation()=="Landscape") lay.SetOrientation( "Horizontal" ); else lay.SetOrientation( "Vertical" ); //let autoscale do its job again txt.SetTextSize( 32 ); txt2.SetTextSize( 32 ); } // calculate the absolute difference in days, months and years between 2 days //ignoring any time component function dateDiff(dt1, dt2) { // setup return object var ret = {days:0, months:0, years:0,sign:""}; // if same date, nothing to do if (dt1 == dt2) return ret; // we will do absolute diff and set the sign if (dt1 > dt2) { var dtmp = dt2; dt2 = dt1; dt1 = dtmp; ret.sign = "-"; } // populate variables for comparison var year1 = dt1.getFullYear(); var year2 = dt2.getFullYear(); var month1 = dt1.getMonth(); var month2 = dt2.getMonth(); var day1 = dt1.getDate(); var day2 = dt2.getDate(); // calculate differences ret.years = year2 - year1; ret.months = month2 - month1; ret.days = day2 - day1; // cope with any negative values. if (ret.days < 0) { // can't span months by arithmetic, use temp date var dtmp = new Date(dt1.getFullYear(), dt1.getMonth() + 1, 1, 0, 0, -1); var numDays = dtmp.getDate(); ret.months -= 1; ret.days += numDays; } // months is pure arithmetic if (ret.months < 0) { ret.months += 12; ret.years -= 1; } return ret; }