Vinnaren i pepparkakshustävlingen!
2018-03-03, 23:41
  #25
Medlem
Jag skrev ihop lite kod snabbt. Det finns nog något jag inte tänkt på och det går säkert att göra det smartare. Jag bara körde på för att komma i mål.
Begränsning är att äldst datum måste anges som första parameter och yngst som andra.
Kod:
function yearDiff(d1d2) {
    
years d2.getFullYear() - d1.getFullYear();
    
months d2.getMonth() - d1.getMonth();
    return 
months years years;
}

function 
monthDiff(d1d2) {
    
months d2.getMonth() - d1.getMonth();
    
days d2.getDate() - d1.getDate();
    
months months months 12 months;
    return 
days months months;
}

function 
dayDiff(d1d2) {
    
days d2.getDate() - d1.getDate();
    if(
days 0) {
        
days1 = new Date(d1.getYear(), d1.getMonth()+10).getDate();
        
days days1 d1.getDate() + d2.getDate();
    }
    
hours d2.getHours() - d1.getHours();
    return 
hours days days;
}

function 
hourDiff(d1d2) {
    
hours d2.getHours() - d1.getHours();
    
minutes d2.getMinutes() - d1.getMinutes();
    
hours hours hours 24 hours;
    return 
minutes hours hours;
}

function 
minuteDiff(d1d2) {
    
minutes d2.getMinutes() - d1.getMinutes();
    
seconds d2.getSeconds() - d1.getSeconds();
    
minutes minutes minutes 60 minutes;
    return 
seconds minutes minutes;
}

function 
secondDiff(d1d2) {
    
seconds d2.getSeconds() - d1.getSeconds();
    return 
seconds seconds 60 seconds;
}

date1 = new Date("2017-03-19T00:01:01")
date2 = new Date("2018-01-20T00:02:01")

console.log("Years: " yearDiff(date1date2));
console.log("Months: " monthDiff(date1date2));
console.log("Days: " dayDiff(date1date2));
console.log("Hours: " hourDiff(date1date2));
console.log("Minutes: " minuteDiff(date1date2));
console.log("Seconds: " secondDiff(date1date2)); 
https://jsfiddle.net/7qu1xkqq/50/
__________________
Senast redigerad av e7andy 2018-03-03 kl. 23:43.
Citera
2018-03-03, 23:52
  #26
Medlem
Citat:
Ursprungligen postat av e7andy
Jag skrev ihop lite kod snabbt. Det finns nog något jag inte tänkt på och det går säkert att göra det smartare. Jag bara körde på för att komma i mål.
Begränsning är att äldst datum måste anges som första parameter och yngst som andra.
Kod:
function yearDiff(d1d2) {
    
years d2.getFullYear() - d1.getFullYear();
    
months d2.getMonth() - d1.getMonth();
    return 
months years years;
}

function 
monthDiff(d1d2) {
    
months d2.getMonth() - d1.getMonth();
    
days d2.getDate() - d1.getDate();
    
months months months 12 months;
    return 
days months months;
}

function 
dayDiff(d1d2) {
    
days d2.getDate() - d1.getDate();
    if(
days 0) {
        
days1 = new Date(d1.getYear(), d1.getMonth()+10).getDate();
        
days days1 d1.getDate() + d2.getDate();
    }
    
hours d2.getHours() - d1.getHours();
    return 
hours days days;
}

function 
hourDiff(d1d2) {
    
hours d2.getHours() - d1.getHours();
    
minutes d2.getMinutes() - d1.getMinutes();
    
hours hours hours 24 hours;
    return 
minutes hours hours;
}

function 
minuteDiff(d1d2) {
    
minutes d2.getMinutes() - d1.getMinutes();
    
seconds d2.getSeconds() - d1.getSeconds();
    
minutes minutes minutes 60 minutes;
    return 
seconds minutes minutes;
}

function 
secondDiff(d1d2) {
    
seconds d2.getSeconds() - d1.getSeconds();
    return 
seconds seconds 60 seconds;
}

date1 = new Date("2017-03-19T00:01:01")
date2 = new Date("2018-01-20T00:02:01")

console.log("Years: " yearDiff(date1date2));
console.log("Months: " monthDiff(date1date2));
console.log("Days: " dayDiff(date1date2));
console.log("Hours: " hourDiff(date1date2));
console.log("Minutes: " minuteDiff(date1date2));
console.log("Seconds: " secondDiff(date1date2)); 
https://jsfiddle.net/7qu1xkqq/50/
Tack som in i helvete att du tagit dig tiden för detta. Verkligen!

Jag testar. Har gjort några få tester hittills. Ser lovande ut! Funkar det så är jag är skyldig dig en öl (så att du sjunker till min nivå)

Jag ser att det inte ger önskat resultat på de konstiga fallen som jag nämnde i mitt förra inlägg (dag 31) men det borde säkert gå att komma runt om man har en fungerande grund som du kanske har lyckats med (eller så kanske det är jag som tänker fel i mitt önskemål)


Jag ser ett mönster i dina beräkningar, att du behöver ta med det tidigare bastalet, kanske man man förkorta det ännu mer i sann metamatikanda

Imponerande
__________________
Senast redigerad av Daudodidi 2018-03-03 kl. 23:59.
Citera
2018-03-04, 00:01
  #27
Medlem
Citat:
Ursprungligen postat av e7andy
Jag skrev ihop lite kod snabbt. Det finns nog något jag inte tänkt på och det går säkert att göra det smartare. Jag bara körde på för att komma i mål.
Begränsning är att äldst datum måste anges som första parameter och yngst som andra.
Kod:
function yearDiff(d1d2) {
    
years d2.getFullYear() - d1.getFullYear();
    
months d2.getMonth() - d1.getMonth();
    return 
months years years;
}

function 
monthDiff(d1d2) {
    
months d2.getMonth() - d1.getMonth();
    
days d2.getDate() - d1.getDate();
    
months months months 12 months;
    return 
days months months;
}

function 
dayDiff(d1d2) {
    
days d2.getDate() - d1.getDate();
    if(
days 0) {
        
days1 = new Date(d1.getYear(), d1.getMonth()+10).getDate();
        
days days1 d1.getDate() + d2.getDate();
    }
    
hours d2.getHours() - d1.getHours();
    return 
hours days days;
}

function 
hourDiff(d1d2) {
    
hours d2.getHours() - d1.getHours();
    
minutes d2.getMinutes() - d1.getMinutes();
    
hours hours hours 24 hours;
    return 
minutes hours hours;
}

function 
minuteDiff(d1d2) {
    
minutes d2.getMinutes() - d1.getMinutes();
    
seconds d2.getSeconds() - d1.getSeconds();
    
minutes minutes minutes 60 minutes;
    return 
seconds minutes minutes;
}

function 
secondDiff(d1d2) {
    
seconds d2.getSeconds() - d1.getSeconds();
    return 
seconds seconds 60 seconds;
}

date1 = new Date("2017-03-19T00:01:01")
date2 = new Date("2018-01-20T00:02:01")

console.log("Years: " yearDiff(date1date2));
console.log("Months: " monthDiff(date1date2));
console.log("Days: " dayDiff(date1date2));
console.log("Hours: " hourDiff(date1date2));
console.log("Minutes: " minuteDiff(date1date2));
console.log("Seconds: " secondDiff(date1date2)); 
https://jsfiddle.net/7qu1xkqq/50/
Du har en bugg i hur du beräknar månaderna bland annat. Om months är 0 och days negativ, drar du bort ett från months och får negativt antal.
Du måste se till att antalet är icke-negativt som sista steg.
Citera
2018-03-04, 00:07
  #28
Avstängd
Citat:
Ursprungligen postat av Daudodidi
Bra fråga. Det finns inte enligt vår vardagslogik.

Citat:
Ursprungligen postat av Daudodidi
• Faktum är att 1 månad från 31-någonting aldrig kommer att existera eftersom endast varannan månad har 31 dagar.

Att kombinera den revolt mot logiken som människan behöver, med exaktheten från maskinerna som vi också behöver, är kanske vad programmering handlar om? Undantagen från reglerna, t.ex. i ett spel, är det verkligt intressanta.
Citera
2018-03-04, 00:12
  #29
Medlem
Citat:
Ursprungligen postat av e7andy
Jag skrev ihop lite kod snabbt. Det finns nog något jag inte tänkt på och det går säkert att göra det smartare. Jag bara körde på för att komma i mål.
Begränsning är att äldst datum måste anges som första parameter och yngst som andra.
Kod:
function yearDiff(d1d2) {
    
years d2.getFullYear() - d1.getFullYear();
    
months d2.getMonth() - d1.getMonth();
    return 
months years years;
}

function 
monthDiff(d1d2) {
    
months d2.getMonth() - d1.getMonth();
    
days d2.getDate() - d1.getDate();
    
months months months 12 months;
    return 
days months months;
}

function 
dayDiff(d1d2) {
    
days d2.getDate() - d1.getDate();
    if(
days 0) {
        
days1 = new Date(d1.getYear(), d1.getMonth()+10).getDate();
        
days days1 d1.getDate() + d2.getDate();
    }
    
hours d2.getHours() - d1.getHours();
    return 
hours days days;
}

function 
hourDiff(d1d2) {
    
hours d2.getHours() - d1.getHours();
    
minutes d2.getMinutes() - d1.getMinutes();
    
hours hours hours 24 hours;
    return 
minutes hours hours;
}

function 
minuteDiff(d1d2) {
    
minutes d2.getMinutes() - d1.getMinutes();
    
seconds d2.getSeconds() - d1.getSeconds();
    
minutes minutes minutes 60 minutes;
    return 
seconds minutes minutes;
}

function 
secondDiff(d1d2) {
    
seconds d2.getSeconds() - d1.getSeconds();
    return 
seconds seconds 60 seconds;
}

date1 = new Date("2017-03-19T00:01:01")
date2 = new Date("2018-01-20T00:02:01")

console.log("Years: " yearDiff(date1date2));
console.log("Months: " monthDiff(date1date2));
console.log("Days: " dayDiff(date1date2));
console.log("Hours: " hourDiff(date1date2));
console.log("Minutes: " minuteDiff(date1date2));
console.log("Seconds: " secondDiff(date1date2)); 
https://jsfiddle.net/7qu1xkqq/50/
Ett problem är tyvärr att skillnaden mellan 31 mars och 28 februari ger identiska svar oavsett om det är skottår eller ej. Det kan inte stämma eftersom det är 1 dag extra där mellan vid skottår. Behöver ma kanske beräkna antalet dagar i månaderna?

2018 (vanligt år):
Kod:
Years: 0
Months: 1
Days: 3
Hours: 0
Minutes: 0
Seconds: 0

2020 (skottår):
Kod:
Years: 0
Months: 1
Days: 3
Hours: 0
Minutes: 0
Seconds: 0

Den potentiella lösningen kanske möjligtvis kanske också lösa dag 31-problemet


Edit:
Vad i helvete, kollar jag 28 feb mot 1 mars så är det ju rätt. Kanske kollade fel innan, hold on

Edit 2:
Okej, skottår ger rätt resultat – såvida dagen inte är över dag 28.

Detta gäller för 2018 vs 2020 (skottår):
28 feb - 01 mars = rätt
28 feb - 28 mars = rätt
28 feb - 29 mars = fel (båda ger samma resultat, vilket ska vara omöjligt)

Mind = blown

Edit 3:
Men alla andra dag 31-or stämmer. Så det är endast skottåret som fuckar upp allt(?)
__________________
Senast redigerad av Daudodidi 2018-03-04 kl. 00:30.
Citera
2018-03-04, 07:19
  #30
Medlem
Citat:
Ursprungligen postat av Daudodidi
Lyckas du rota fram det där skriptet eller minns hur du gjorde så hojta gärna till
Originalet - fulhacken - finns nog inte kvar, men strax efteråt gjorde jag en servergenererad html-version av automatisk statistik, där jag återanvände koden för att lägga på den (för människor) viktiga informationen veckodag:
Kod:
...
     6  awk '
     7  BEGIN {
     8    oLymp = 1 + 4 * 365;
     9    mnams = \
    10      "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec";
    11    numms = "1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12";
    12      mday ="31 28 31 30 31 30 31 31 30 31 30 31"
    13    split(mnams, mnam, " "); split(numms, numm, " "); split(mday, mDays, " ");
    14    for (i in mnam){mnum[mnam[i]] = numm[i]; mdays[numm[i]] = mDays[numm[i]];};
    15    oLday = 3 * 365 + 1 + mdays[mnum["Jan"]] + mdays[mnum["Feb"]];
    16    wnams = "sö mo ti on to fr lö"; split(wnams, wnam, " ");
    17   # %End of DDay data. #
...
    40   function wDay (DNUM) {
    41          return  wnam[1 + ((1 + DNUM) % 7)];
    42   };
    43   function DayDate (yY, mM, dD) {
    44  dOnum = oLymp * int((yY - 1901) / 4);
    45  dORnum = ((yY - 1901) % 4) * 365;
    46  dYnum = 0; for (i = mM; i--; i > 0 ) dYnum += mdays[i];
    47  dYnum += dD; if ((mM > 2) && ((dYnum + dORnum) >= oLday)) dYnum++;
    48  dNum = dYnum + dORnum + dOnum; 
    49    if ( \
    50          (mM < 13) && \
    51          ( (dD <= mdays[mM]) || \
    52           ((dYnum + dORnum) == oLday))) \
    53          return sprintf("%2s</td><td>%4d-%02d-%02d", wDay(dNum), yY, mM, dD);
    54   };
Radnumren har inget med koden att göra - Gör det bara lättare att orientera sig i ev. diskussion.
Principen bygger på (krävde) att jag använde tidsbegreppet olymp (olympiad) samt håller koll på om datumet infaller före eller efter den eventuella skottdagen på året. (Rad 47)

För beräkningsarbete i shell-skript används givetvis 'programspråket' som behandlar programmerare som människor: awk.

Det jag minns krävde lite testning/debugging var att hålla reda på när och hur man skulle förhålla sig till datumdelarnas olika offset=0 mot offset=1.
Och så var det 'svårt' att hitta på nya variabelnamn för hjälpvariabler som betecknade nästan samma sak...
__________________
Senast redigerad av iconicatab 2018-03-04 kl. 07:34. Anledning: Förtydligat
Citera
2018-03-04, 10:15
  #31
Medlem
Citat:
Ursprungligen postat av im3w1l
Du har en bugg i hur du beräknar månaderna bland annat. Om months är 0 och days negativ, drar du bort ett från months och får negativt antal.
Du måste se till att antalet är icke-negativt som sista steg.
Ja, det är klurigt när man måste räkna tillbaka ett steg hela tiden. Det får bli fler kontroller på om man hamnar på föregående år eller månad. Det bör även bli samma problem med dagar.
Ett oturligt klockslag kan göra att alla värden måste hoppa tillbaka ett steg. Det känns som att man bör skapa en smartare funktion som tar hand om allt och triggar alla avdragningar av 1 om det uppstår.

Citat:
Ursprungligen postat av Daudodidi
Ett problem är tyvärr att skillnaden mellan 31 mars och 28 februari ger identiska svar oavsett om det är skottår eller ej. Det kan inte stämma eftersom det är 1 dag extra där mellan vid skottår. Behöver ma kanske beräkna antalet dagar i månaderna?

2018 (vanligt år):
Kod:
Years: 0
Months: 1
Days: 3
Hours: 0
Minutes: 0
Seconds: 0

2020 (skottår):
Kod:
Years: 0
Months: 1
Days: 3
Hours: 0
Minutes: 0
Seconds: 0

Den potentiella lösningen kanske möjligtvis kanske också lösa dag 31-problemet


Edit:
Vad i helvete, kollar jag 28 feb mot 1 mars så är det ju rätt. Kanske kollade fel innan, hold on

Edit 2:
Okej, skottår ger rätt resultat – såvida dagen inte är över dag 28.

Detta gäller för 2018 vs 2020 (skottår):
28 feb - 01 mars = rätt
28 feb - 28 mars = rätt
28 feb - 29 mars = fel (båda ger samma resultat, vilket ska vara omöjligt)

Mind = blown

Edit 3:
Men alla andra dag 31-or stämmer. Så det är endast skottåret som fuckar upp allt(?)
Jag kollar antalet dagar för varje månad och har koll på om det är skottår, men antalet dagar räknas på startåret. Inte på slutåret. Om man ändrar till slutåret och kollar på månaden innan den angivna så bör det bli rätt, men man måste hålla koll på vilken månad man står på så att man hanterar om man står på januari och ska kolla på året innan.
Citera
2018-03-05, 00:37
  #32
Medlem
henrikos avatar
Citat:
Ursprungligen postat av Daudodidi
jag ville dela upp X antal sekunder i minuter, timmar, dagar, veckor, månader, år.

Det visade sig vara lättare sagt än gjort. Det visade sig vara ett ödestigert misstag.

Problemet är som bekant att längden på en månad och år varierar.

Eller fuck it. Låt oss inte fokusera på sekunder. Låt oss fokusera på vanliga människodatum. För att det är irrationella människor jag vill använda detta för. Men fokusera på sekunder om du tror att det är lättare.

Det blir lite godtyckligt hur man ska definiera en månad, eller flera månader, oavsett om man låser ett intervall i kalendern eller om man låter det bara vara en mängd sekunder.

Citat:
Ursprungligen postat av Daudodidi
Om jag har datumet
2018-01-20 00:02:01

och datumet
2017-03-19 00:01:01

Så vill jag få ut resultatet:
År: 0
månader: 10
Dagar: 1
Timmar: 0
Minuter: 1
Sekunder: 0


Eftersom:
2017-02-21 00:02:01
+ 10 månader
+ 1 dag
+ 1 minut
= 2018-01-20 00:00:01
Tror jag.


Hur fan gör jag?

Bra fråga. Inte helt självklart detta. Men eftersom det går att skriva och resonera som du gör, och det inte låter jättekonstigt för mig som människa, borde det gå att skriva kod som följer resonemanget i alla fall i de enklaste grundfallen.

Citat:
Ursprungligen postat av iconicatab
varje 'position'/tidsenhet har sin egen talbas och 0-offset (dag, mån). Annars följer man samma regler (typ att "få låna").

Ja, detta verkar ge enklast kod som motsvarar ungefär så som de flesta tänker.

Citat:
Ursprungligen postat av Eliwood
Om jag har förstått det rätt vill du räkna antalet gränser (mellan t.ex. två månader) som passerats under resan mellan de två datumen?

Jag funderade också på det, att räkna olika passerade gränser, före den första, och sedan efter den sista överordnade gränsen passerats. Men gränserna sammanfaller inte med de i kalendern naturliga gränserna, om TS önskemål ska uppfyllas. Då måste man som jag ser det använda ena perioddatumet som gränstrigger. Men då riskerat månaderna bli hälften så många om gränstriggern hamnar på den 31:e. Jag bedömde att detta var en trasslig väg.

Citat:
Ursprungligen postat av Daudodidi
Det är kanske ett tal med olika talbaser. Det är därför det känns så jäkla svårt.

Jo, så kan man kunna se på det. Men inte nog med att det olika talbaser. En av dom varierar.

Citat:
Ursprungligen postat av Daudodidi
Jag vill även klämma in veckor här, men för att förenkla för oss alla kan vi skippa det.

Veckor är ett helvete för sig. Och här ser jag potentiellt en del problem om man ska kombinera hantering av både månader och veckor samtidigt. Men jag återkommer om jag ser en ljusning.

Tillsvidare ignorerade jag veckor.

Här är mitt första försök i alla fall. Jag gjorde en period-"klass". (All felhantering saknas. Många funktioner är helt otestade. Jag har bara provat i en webbläsare.)

Kod:
// Class

function Period(startdateenddate)
{
  var 
d1 startdate;
  var 
d2 enddate;
  
  var 
secondsperminute 60;
  var 
minutesperhour 60;
  var 
hoursperday 24;
  var 
monthsperyear 12;    
  var 
secondsperday secondsperminute minutesperhour hoursperday;
  var 
kilo 1000;

  var 
modneedsrefresh 1;
  var 
modyears null;
  var 
modmonths null;
  var 
moddays null;
  var 
modhours null;
  var 
modminutes null;
  var 
modseconds null;

  
DoNewDates(d1d2);
  
DiffWithBorrow(d1d2);

  function 
DoNewDates(d1d2)
  {
    if (
d2.getTime() < d1.getTime())
    {
      var 
tempd = new Date();
      
tempd.setTime(d2.getTime());
      
d2.setTime(d1.getTime());
      
d1.setTime(tempd.getTime());
    }

    
modneedsrefresh 1;
  }

  function 
DiffWithBorrow(d1d2)
  {
    if (
modneedsrefresh != 0)
    {
      
modyears 0;
      
modmonths 0;
      
moddays 0;
      
modhours 0;
      
modminutes 0;
      
modseconds 0;

      
modseconds += d2.getUTCSeconds() - d1.getUTCSeconds();
      if (
modseconds 0)
      {
        
modseconds += secondsperminute;
        
modminutes -= 1;
      }
      
modminutes += d2.getUTCMinutes() - d1.getUTCMinutes();      
      if (
modminutes 0)
      {
        
modminutes += minutesperhour;
        
modhours -= 1;
      }
      
modhours += d2.getUTCHours() - d1.getUTCHours();
      if (
modhours 0)
      {
        
modhours += hoursperday;
        
moddays -= 1;
      }
      
moddays += d2.getUTCDate() - d1.getUTCDate();
      if (
moddays 0)
      {
        var 
lastdayind1month = new Date(Date.UTC(d1.getUTCFullYear(), d1.getUTCMonth() + 10));
        
moddays += lastdayind1month.getUTCDate();
        
modmonths -= 1;
      }
      
modmonths += d2.getUTCMonth() - d1.getUTCMonth();
      if (
modmonths 0)
      {
        
modmonths += monthsperyear;
        
modyears -= 1;
      }
      
modyears += d2.getUTCFullYear() - d1.getUTCFullYear();

      
modneedsrefresh 0;
    }
  }

  
this.SetStartDate = function(startdate)
  {
    
d1 startdate;
    
DoNewDates(d1d2);
  }

  
this.SetEndDate = function(enddate)
  {
    
d1 enddate;
    
DoNewDates(d1d2);
  }

  
this.MilliSeconds = function()
  {
    return 
parseInt(d2 d1);
  }

  
this.Seconds = function()
  {
    return 
parseInt(this.MilliSeconds() / kilo);
  }

  
this.Minutes = function()
  {
    return 
parseInt(this.MilliSeconds() / kilo secondsperminute);
  }

  
this.Hours = function()
  {
    return 
parseInt(this.MilliSeconds() / kilo secondsperhour);
  }

  
this.Days = function()
  {
    return 
parseInt(this.MilliSeconds() / (kilo secondsperday));
  }

  
this.Months = function()
  {
    
DiffWithBorrow();
    return 
modmonths modyears 12;
  }

  
this.Years = function()
  {
    
DiffWithBorrow();
    return 
modyears;
  }

  
this.ModularSeconds = function()
  {
    
DiffWithBorrow();
    return 
modseconds;
  }
  
  
this.ModularMinutes = function()
  {
    
DiffWithBorrow();
    return 
modminutes;
  }
  
  
this.ModularHours = function()
  {
    
DiffWithBorrow();
    return 
modhours;
  }

  
this.ModularMonths = function()
  {
    
DiffWithBorrow();
    return 
modmonths;
  }

  
this.ModularSummaryText = function()
  {
    
DiffWithBorrow();
    var 
result '';
    
result += '' modyears ' years';
    
result += ', ' modmonths ' months';
    
result += ', ' moddays ' days';
    
result += ', ' modhours ' hours';
    
result += ', ' modminutes ' minutes';
    
result += ', ' modseconds ' seconds';
    return 
result;
  }

  
this.ModularCompareWith = function(cwyearscwmonthscwdayscwhourscwminutescwseconds)
  {
    var 
result 0;
    if (
modyears cwyears)
    {
      
result = -1;
    }
    if (
modyears cwyears)
    {
      
result 1;
    }
    if (
result == 0)
    {
      if (
modmonths cwmonths)
      {
        
result = -1;
      }
      if (
modmonths cwmonths)
      {
        
result 1;
      }
      if (
result == 0)
      {
        if (
moddays cwdays)
        {
          
result = -1;
        }
        if (
moddays cwdays)
        {
          
result 1;
        }
        if (
result == 0)
        {
          if (
modhours cwhours)
          {
            
result = -1;
          }
          if (
modhours cwhours)
          {
            
result 1;
          }
          if (
result == 0)
          {

            if (
modminutes cwminutes)
            {
              
result = -1;
            }
            if (
modminutes cwminutes)
            {
              
result 1;
            }
            if (
result == 0)
            {
              if (
modseconds cwseconds)
              {
                
result = -1;
              }
              if (
modseconds cwseconds)
              {
                
result 1;
              }
            }
          }
        }
      }
    }
    return 
result;
  }

  return 
this;  


Exempel på hur man kan använda klassen.

Kod:
// Demo

function Demo()
{
    var 
born = new Date(Date.UTC(1976,  -(1), 22201200000));
    var 
died = new Date(Date.now());
    var 
life = new Period(borndied);
    
alert('Congratulation, you lived ' life.Months() + ' months.');
    
alert(life.ModularSummaryText());

Citera
2018-03-05, 00:41
  #33
Medlem
henrikos avatar
Slänger även med lite testfall på det som jag har testat, ifall någon kan tänkas ha glädje av dom.
Citera
2018-03-05, 23:00
  #34
Medlem
Citat:
Ursprungligen postat av henriko
Det blir lite godtyckligt hur man ska definiera en månad, eller flera månader, oavsett om man låser ett intervall i kalendern eller om man låter det bara vara en mängd sekunder.



Bra fråga. Inte helt självklart detta. Men eftersom det går att skriva och resonera som du gör, och det inte låter jättekonstigt för mig som människa, borde det gå att skriva kod som följer resonemanget i alla fall i de enklaste grundfallen.



Ja, detta verkar ge enklast kod som motsvarar ungefär så som de flesta tänker.



Jag funderade också på det, att räkna olika passerade gränser, före den första, och sedan efter den sista överordnade gränsen passerats. Men gränserna sammanfaller inte med de i kalendern naturliga gränserna, om TS önskemål ska uppfyllas. Då måste man som jag ser det använda ena perioddatumet som gränstrigger. Men då riskerat månaderna bli hälften så många om gränstriggern hamnar på den 31:e. Jag bedömde att detta var en trasslig väg.



Jo, så kan man kunna se på det. Men inte nog med att det olika talbaser. En av dom varierar.



Veckor är ett helvete för sig. Och här ser jag potentiellt en del problem om man ska kombinera hantering av både månader och veckor samtidigt. Men jag återkommer om jag ser en ljusning.

Tillsvidare ignorerade jag veckor.

Här är mitt första försök i alla fall. Jag gjorde en period-"klass". (All felhantering saknas. Många funktioner är helt otestade. Jag har bara provat i en webbläsare.)

Kod:
// Class

function Period(startdateenddate)
{
  var 
d1 startdate;
  var 
d2 enddate;
  
  var 
secondsperminute 60;
  var 
minutesperhour 60;
  var 
hoursperday 24;
  var 
monthsperyear 12;    
  var 
secondsperday secondsperminute minutesperhour hoursperday;
  var 
kilo 1000;

  var 
modneedsrefresh 1;
  var 
modyears null;
  var 
modmonths null;
  var 
moddays null;
  var 
modhours null;
  var 
modminutes null;
  var 
modseconds null;

  
DoNewDates(d1d2);
  
DiffWithBorrow(d1d2);

  function 
DoNewDates(d1d2)
  {
    if (
d2.getTime() < d1.getTime())
    {
      var 
tempd = new Date();
      
tempd.setTime(d2.getTime());
      
d2.setTime(d1.getTime());
      
d1.setTime(tempd.getTime());
    }

    
modneedsrefresh 1;
  }

  function 
DiffWithBorrow(d1d2)
  {
    if (
modneedsrefresh != 0)
    {
      
modyears 0;
      
modmonths 0;
      
moddays 0;
      
modhours 0;
      
modminutes 0;
      
modseconds 0;

      
modseconds += d2.getUTCSeconds() - d1.getUTCSeconds();
      if (
modseconds 0)
      {
        
modseconds += secondsperminute;
        
modminutes -= 1;
      }
      
modminutes += d2.getUTCMinutes() - d1.getUTCMinutes();      
      if (
modminutes 0)
      {
        
modminutes += minutesperhour;
        
modhours -= 1;
      }
      
modhours += d2.getUTCHours() - d1.getUTCHours();
      if (
modhours 0)
      {
        
modhours += hoursperday;
        
moddays -= 1;
      }
      
moddays += d2.getUTCDate() - d1.getUTCDate();
      if (
moddays 0)
      {
        var 
lastdayind1month = new Date(Date.UTC(d1.getUTCFullYear(), d1.getUTCMonth() + 10));
        
moddays += lastdayind1month.getUTCDate();
        
modmonths -= 1;
      }
      
modmonths += d2.getUTCMonth() - d1.getUTCMonth();
      if (
modmonths 0)
      {
        
modmonths += monthsperyear;
        
modyears -= 1;
      }
      
modyears += d2.getUTCFullYear() - d1.getUTCFullYear();

      
modneedsrefresh 0;
    }
  }

  
this.SetStartDate = function(startdate)
  {
    
d1 startdate;
    
DoNewDates(d1d2);
  }

  
this.SetEndDate = function(enddate)
  {
    
d1 enddate;
    
DoNewDates(d1d2);
  }

  
this.MilliSeconds = function()
  {
    return 
parseInt(d2 d1);
  }

  
this.Seconds = function()
  {
    return 
parseInt(this.MilliSeconds() / kilo);
  }

  
this.Minutes = function()
  {
    return 
parseInt(this.MilliSeconds() / kilo secondsperminute);
  }

  
this.Hours = function()
  {
    return 
parseInt(this.MilliSeconds() / kilo secondsperhour);
  }

  
this.Days = function()
  {
    return 
parseInt(this.MilliSeconds() / (kilo secondsperday));
  }

  
this.Months = function()
  {
    
DiffWithBorrow();
    return 
modmonths modyears 12;
  }

  
this.Years = function()
  {
    
DiffWithBorrow();
    return 
modyears;
  }

  
this.ModularSeconds = function()
  {
    
DiffWithBorrow();
    return 
modseconds;
  }
  
  
this.ModularMinutes = function()
  {
    
DiffWithBorrow();
    return 
modminutes;
  }
  
  
this.ModularHours = function()
  {
    
DiffWithBorrow();
    return 
modhours;
  }

  
this.ModularMonths = function()
  {
    
DiffWithBorrow();
    return 
modmonths;
  }

  
this.ModularSummaryText = function()
  {
    
DiffWithBorrow();
    var 
result '';
    
result += '' modyears ' years';
    
result += ', ' modmonths ' months';
    
result += ', ' moddays ' days';
    
result += ', ' modhours ' hours';
    
result += ', ' modminutes ' minutes';
    
result += ', ' modseconds ' seconds';
    return 
result;
  }

  
this.ModularCompareWith = function(cwyearscwmonthscwdayscwhourscwminutescwseconds)
  {
    var 
result 0;
    if (
modyears cwyears)
    {
      
result = -1;
    }
    if (
modyears cwyears)
    {
      
result 1;
    }
    if (
result == 0)
    {
      if (
modmonths cwmonths)
      {
        
result = -1;
      }
      if (
modmonths cwmonths)
      {
        
result 1;
      }
      if (
result == 0)
      {
        if (
moddays cwdays)
        {
          
result = -1;
        }
        if (
moddays cwdays)
        {
          
result 1;
        }
        if (
result == 0)
        {
          if (
modhours cwhours)
          {
            
result = -1;
          }
          if (
modhours cwhours)
          {
            
result 1;
          }
          if (
result == 0)
          {

            if (
modminutes cwminutes)
            {
              
result = -1;
            }
            if (
modminutes cwminutes)
            {
              
result 1;
            }
            if (
result == 0)
            {
              if (
modseconds cwseconds)
              {
                
result = -1;
              }
              if (
modseconds cwseconds)
              {
                
result 1;
              }
            }
          }
        }
      }
    }
    return 
result;
  }

  return 
this;  


Exempel på hur man kan använda klassen.

Kod:
// Demo

function Demo()
{
    var 
born = new Date(Date.UTC(1976,  -(1), 22201200000));
    var 
died = new Date(Date.now());
    var 
life = new Period(borndied);
    
alert('Congratulation, you lived ' life.Months() + ' months.');
    
alert(life.ModularSummaryText());

Herrejävlar, det ser lovande ut! Jag ska köra det genom mina tester
Citera
2018-03-05, 23:20
  #35
Medlem
henriko, du är en jävla gud.

Jag vet inte hur du gjorde (jag får gå igenom din kod för det), men du verkar fanimej ha löst det...

Alla mina tester verkar gå igenom – du har på något sätt hittat nyckeln till den mänskliga datumhjärnan (i alla fall min). Din kod behöver bara snyggas till lite och bli funktionell (så att jag kan känna mig duktig och komma till användning!) men allt verkar fungera. Alla tester lirar, så jag ska se hur det lirar när jag leker lite med det i testmiljön

Om något mot all förmodan inte skulle fungera så lär det vara en petitess att fixa med tanke på att alla tester lirar. Skål och bug, ers nåd.
__________________
Senast redigerad av Daudodidi 2018-03-05 kl. 23:23.
Citera
2018-03-05, 23:26
  #36
Medlem
Riddarhusets avatar
Räkna med 31 dagar + hela månader ur almanackan i kronologisk ordning så får vi ett år minus februari. Det blir enklast och då får du även 2 minuter över till annat.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback