|
NAMEDate::Manip::Calc - describes date calculationsSYNOPSISTwo objects (both of which are either Date::Manip::Date or Date::Manip::Delta objects) may be used to creates a third object based on those two.$delta = $date->calc($date2 [,$subtract] [,$mode]); $date2 = $date->calc($delta [,$subtract]); $date2 = $delta->calc($date1 [,$subtract]); $delta3 = $delta1->calc($delta2 [,$subtract] [,$no_normalize]); DESCRIPTIONThis document describes the different types of calculations that can be done using dates and deltas. Date calculations are much more complicated than they initially appear, so this document is fairly large.The complication in date calculations is due to the fact that it is impossible to express some parts of a delta as an exact length. Some examples will illustrate this: As an example, let's take two dates and determine how much time elapsed between them: Nov 3 2016 11:00:00 Dec 5 2016 12:00:00 Elapsed time: 770 hours There are several ways to describe the time that elapsed. The first way is to give the difference exactly. This is the exact delta. An exact delta is always described in terms of hours, minutes, and seconds. The problem with this is that we don't think in terms of exact deltas. We think in terms which cannot be expressed exactly. For example, most people would look at those two dates and think: Perceived: 1 month, 2 days, 1 hour But the two dates: Feb 3 2016 11:00:00 Mar 5 2016 12:00:00 Elapsed time: 745 hours Perceived: 1 month, 2 days, 1 hour Some fields in a delta do not have an exact length. A year is usually 365 days long, but sometimes it is 366. A month might be 28, 29, 30, or 31 days long. Perhaps the most unexpected difficulty is that days are not of constant length. Most people would define a day as 24 hours, but when you take daylight saving time into account that definition produces unexpected results. The following calculation illustrates this: Nov 5, 2011 02:30 EDT + 24 hour Result: Nov 6, 2011 01:30 EST This immediately causes most people to redefine a day as the amount of time between the same wall clock time. For example, the amount of time between noon one day and noon the next (regardless of daylight saving time changes). This definition doesn't work either. For example: Mar 12, 2011 02:30 EST + 1 day (same time next day) Result: Mar 13 02:30 EST But that date does not exist! Neither does: Result: Mar 13 02:30 EDT An alternate calculation could be: Nov 5, 2011 01:30 EDT + 1 day (same time next day) Result: Nov 6, 01:30 EDT Result: Nov 6, 01:30 EST Both of those results exist. Which result did you mean? The first one is probably correct (since it is 24 hours later), but an hour later, you will have the same clock time again. So, the same time next day definition doesn't work at all for some dates (during a 'spring forward' type daylight saving time transition) and is ambiguous for others (during a 'fall back' type daylight saving time transition). Calculations involving exact deltas are unambiguous in all cases. A second class of delta is called a semi-exact delta, and these add days (and weeks) to the delta, and treats days as a "same time next day" at all times except the two cases where the resulting date falls in the period where a daylight saving time transition is occurring. Then it falls back to the 24 hour definition. A final class of delta is an approximate delta which includes all of the fields (years and months). This allows Date::Manip to handle deltas in a way that is consistent with how most people perceive the elapsed time. It should be noted that there is some uncertaintly there as not everyone's definition of how a delta is perceived is the same, but in general, they should be closer to what most people think of. TYPES OF CALCULATIONSThis document describes the different types of calculations. Calculations involve two types of Date::Manip objects: dates and deltas. These are described in the Date::Manip::Date and Date::Manip::Delta manuals respectively.Two objects (two dates, two deltas, or one of each) are used. In all cases, if a second object is not passed in, undef is returned. There are 3 types of calculations:
MODEDate::Manip calculations can be divided into two different categories: business and non-business; and within those are three sub-categories: exact, semi-exact, and approximate.
In date-delta and delta-delta calculations, the mode of the calculation will be determined automatically by the delta. In the case of date-date calculations, the mode is supplied as an argument.
TIMEZONE CONSIDERATIONS
It should also be noted that daylight saving time considerations are currently ignored when doing business calculations. In common usage, daylight saving time changes occurs outside of the business day, so the business day length is constant. As a result, daylight saving time is ignored. BUSINESS MODE CONSIDERATIONSIn order to correctly do business mode calculations, a config file should exist which contains the section defining holidays (otherwise, weekends will be ignored, but all other days will be counted as business days). This is documented below, and in the Date::Manip::Config section of the documentation. Some config variables (namely WorkWeekBeg, WorkWeekEnd, WorkDayBeg, WorkDayEnd, and WorkDay24Hr) defined the length of the work week and work day.If the workday is defined as 08:00 to 18:00, a work week consisting of Mon-Sat, and the standard (American) holidays, then from Tuesday at 12:00 to the following Monday at 14:00 is 5 days and 2 hours. If the "end" of the day is reached in a calculation, it automatically switches to the next day. So, Tuesday at 12:00 plus 6 hours is Wednesday at 08:00 (provided Wed is not a holiday). Also, a date that is not during a workday automatically becomes the start of the next workday. So, Sunday 12:00 and Monday at 03:00 both automatically becomes Monday at 08:00 (provided Monday is not a holiday). Note that a business week is treated the same as an exact week (i.e. from Tuesday to Tuesday, regardless of holidays). Because this means that the relationship between days and weeks is NOT unambiguous, when a semi-exact delta is produced from two dates, it will be in terms of d/h/mn/s (i.e. no week field). Anyone using business mode is going to notice a few quirks about it which should be explained. When I designed business mode, I had in mind what a business which promises 1 business day turnaround really means. If you do a business calculation (with the workday set to 9:00-17:00), you will get the following: Saturday at noon + 1 business day = Tuesday at 9:00 Saturday at noon - 1 business day = Friday at 9:00 What does this mean? As an example, say I use a business that works 9-5 and they have a drop box so I can drop things off over the weekend and they promise 1 business day turnaround. If I drop something off Friday night, Saturday, or Sunday, it doesn't matter. They're going to get started on it Monday morning. It'll be 1 business day to finish the job, so the earliest I can expect it to be done is around 17:00 Monday or 9:00 Tuesday morning. Unfortunately, there is some ambiguity as to what day 17:00 really falls on, similar to the ambiguity that occurs when you ask what day midnight falls on. Although it's not the only answer, Date::Manip treats midnight as the beginning of a day rather than the end of one. In the same way, 17:00 is equivalent to 9:00 the next day and any time the date calculations encounter 17:00, it automatically switch to 9:00 the next day. Although this introduces some quirks, I think this is justified. I also think that it is the way most people think of it. If I drop something off first thing Monday morning, I would expect to pick it up first thing Tuesday if there is 1 business day turnaround. Equivalently, if I want a job to be finished on Saturday (despite the fact that I cannot pick it up since the business is closed), I have to drop it off no later than Friday at 9:00. That gives them a full business day to finish it off. Of course, I could just as easily drop it off at 17:00 Thursday, or any time between then and 9:00 Friday. Again, it's a matter of treating 17:00 as ambiguous. So Saturday + 1 business day = Tuesday at 9:00 (which means anything from Monday 17:00 to Tuesday 9:00), but Monday at 9:01 + 1 business day = Tuesday at 9:01 which is unambiguous. It should be noted that when adding years, months, and weeks, the business day is ignored. Once they've been added, the resulting date is forced to be a business time (i.e. it moves to the start of the next business day if it wasn't one already) before proceeding with the days, hours, minutes, and seconds part. EXACT, SEMI-EXACT, AND APPROXIMATE DATE/DELTA CALCULATIONSThis section contains more details about exactly how exact, semi-exact, and approximate calculations are performed for date/delta calculations.All calculations make use of some exact quantities, including: 1 year = 12 months 1 week = 7 days 1 hour = 60 minutes 1 minute = 60 seconds This leaves two relationships which are not exact: 1 month = ? days 1 day = ? hours For non-business calculations, a day is usually 24 hours long. Due to daylight saving time transitions which might make a day be 23 or 25 hours long (or in some cases, some other length), the relation is not exact. Whenever possible, a day is actually measured as the same time on two days (i.e. Tuesday at noon to Wednesday at noon) even if that period is not precisely 24 hours. For business calculations, a days length is determined by the length of the work day and is known exactly. Exact calculations involve ONLY quantities of time with a known length, so there is no ambiguity in them. Approximate and semi-exact calculations involve variable length fields, and so they must be treated specially. In order to do an approximate or semi-exact calculation, the delta is added to a date in pieces, where the fields in each piece have an exact and known relationship. For a non-business calculation, a calculation occurs in the following steps: year/month fields added week/day fields added hour/minute/second fields added For a business calculation, the steps are: year/month fields added week field added day field added hour/minute/second fields added After each step, a valid date must be present, or it will be adjusted before proceeding to the next step. Note however that for business calculations, the first step must produce a valid date, but not necessarily a business date. The second step will produce a valid business date. A series of examples will illustrate this.
EXACT, SEMI-EXACT, AND APPROXIMATE DATE/DATE CALCULATIONSThis section contains more details about exactly how exact, semi-exact, and approximate calculations are performed for date/date calculations.When calculating the delta between two dates, the delta may take different forms depending on the mode passed in. An exact calculation will produce a delta which included only exact fields. A semi-exact calculation may produce a semi-exact delta, and an approximate calculation may produce an approximate delta. Note that if the two dates are close enough together, an exact delta will be produced (even if the mode is semi-exact or approximate), or it may produce a semi-exact delta in approximate mode. For example, the two dates "Mar 12 1995 12:00" and "Apr 13 1995 12:00" would have an exact delta of "744 hours", and a semi-exact delta of "31 days". It would have an approximate delta of "1 month 1 day". Two dates, "Mar 31 12:00" and "Apr 30 12:00" would have deltas "720 hours" (exact), "30 days" (semi-exact) or "1 month" (approximate). Approximate mode is a more human way of looking at things (you'd say 1 month and 2 days more often then 33 days), but it is less meaningful in terms of absolute time. One thing to remember is that an exact delta is exactly the amount of time that has passed, including all effects of daylight saving time. Semi-exact and approximate deltas usually ignore the affects of daylight saving time. SUBTRACTIONIn exact and semi-exact calculations, and in delta-delta calculations, the the $subtract argument is easy to understand. When working with an approximate delta however (either when adding an approximate delta to a date, or when taking two dates to get an approximate delta), there is a degree of uncertainty in how the calculation is done, and the $subtract argument is used to specify exactly how the approximate delta is to be use. An example illustrates this quite well.If you take the date Jan 4, 2000 and subtract a delta of "1 month 1 week" from it, you end up with Nov 27, 1999 (Jan 4, 2000 minus 1 month is Dec 4, 1999; minus 1 week is Nov 27, 1999). But Nov 27, 1999 plus a delta of "1 month 1 week" is Jan 3, 2000 (Nov 27, 1999 plus 1 month is Dec 27, 1999; plus 1 week is Jan 3, 2000). In other words the approximate delta (but NOT the exact or semi-exact delta) is different depending on whether you move from earlier date to the later date, or vice versa. And depending on what you are calculating, both are useful. In order to resolve this, the $subtract argument can take on the values 0, 1, or 2, and have different meanings.
APPROXIMATE DATE/DATE CALCULATIONThere are two different ways to look at the approximate delta between two dates.In Date::Manip 5.xx, the approximate delta between the two dates: Jan 10 1996 noon Jan 7 1998 noon was 1:11:4:0:0:0:0 (or 1 year, 11 months, 4 weeks). In calculating this, the first date was adjusted as far as it could go towards the second date without going past it with each unit starting with the years and ending with the seconds. This gave a strictly positive or negative delta, but it isn't actually how most people would think of the delta. As of Date::Manip 6.0, the delta is 2:0:0:-3:0:0:0 (or 2 years minus 3 days). Although this leads to mixed-sign deltas, it is actually how more people would think about the delta. It has the additional advantage of being easier to calculate. For non-business mode calculations, the year/month part of the approximate delta will move a date from the year/month of the first date into the year/month of the second date. The remainder of the delta will adjust the days/hours/minutes/seconds as appropriate. For approximate business mode calculations, the year, date, and week parts will be done approximately, and the remainder will be done exactly. KNOWN BUGSNone known.BUGS AND QUESTIONSPlease refer to the Date::Manip::Problems documentation for information on submitting bug reports or questions to the author.SEE ALSODate::Manip - main module documentationLICENSEThis script is free software; you can redistribute it and/or modify it under the same terms as Perl itself.AUTHORSullivan Beck (sbeck@cpan.org)
Visit the GSP FreeBSD Man Page Interface. |