Enable most of the Date/Time functions to accept array arguments
This commit is contained in:
parent
291ea88a6c
commit
83ff74b97e
|
|
@ -464,7 +464,7 @@ class DateTime
|
||||||
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard date string
|
* PHP DateTime object, or a standard date string
|
||||||
*
|
*
|
||||||
* @return int|string Day of the month
|
* @return array|int|string Day of the month
|
||||||
*/
|
*/
|
||||||
public static function DAYOFMONTH($dateValue = 1)
|
public static function DAYOFMONTH($dateValue = 1)
|
||||||
{
|
{
|
||||||
|
|
@ -492,7 +492,7 @@ class DateTime
|
||||||
* 2 Numbers 1 (Monday) through 7 (Sunday).
|
* 2 Numbers 1 (Monday) through 7 (Sunday).
|
||||||
* 3 Numbers 0 (Monday) through 6 (Sunday).
|
* 3 Numbers 0 (Monday) through 6 (Sunday).
|
||||||
*
|
*
|
||||||
* @return int|string Day of the week value
|
* @return array|int|string Day of the week value
|
||||||
*/
|
*/
|
||||||
public static function WEEKDAY($dateValue = 1, $style = 1)
|
public static function WEEKDAY($dateValue = 1, $style = 1)
|
||||||
{
|
{
|
||||||
|
|
@ -704,7 +704,7 @@ class DateTime
|
||||||
* 17 Week begins on Sunday.
|
* 17 Week begins on Sunday.
|
||||||
* 21 ISO (Jan. 4 is week 1, begins on Monday).
|
* 21 ISO (Jan. 4 is week 1, begins on Monday).
|
||||||
*
|
*
|
||||||
* @return int|string Week Number
|
* @return array|int|string Week Number
|
||||||
*/
|
*/
|
||||||
public static function WEEKNUM($dateValue = 1, $method = self::STARTWEEK_SUNDAY)
|
public static function WEEKNUM($dateValue = 1, $method = self::STARTWEEK_SUNDAY)
|
||||||
{
|
{
|
||||||
|
|
@ -727,7 +727,7 @@ class DateTime
|
||||||
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard date string
|
* PHP DateTime object, or a standard date string
|
||||||
*
|
*
|
||||||
* @return int|string Week Number
|
* @return array|int|string Week Number
|
||||||
*/
|
*/
|
||||||
public static function ISOWEEKNUM($dateValue = 1)
|
public static function ISOWEEKNUM($dateValue = 1)
|
||||||
{
|
{
|
||||||
|
|
@ -751,7 +751,7 @@ class DateTime
|
||||||
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard date string
|
* PHP DateTime object, or a standard date string
|
||||||
*
|
*
|
||||||
* @return int|string Month of the year
|
* @return array|int|string Month of the year
|
||||||
*/
|
*/
|
||||||
public static function MONTHOFYEAR($dateValue = 1)
|
public static function MONTHOFYEAR($dateValue = 1)
|
||||||
{
|
{
|
||||||
|
|
@ -775,7 +775,7 @@ class DateTime
|
||||||
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard date string
|
* PHP DateTime object, or a standard date string
|
||||||
*
|
*
|
||||||
* @return int|string Year
|
* @return array|int|string Year
|
||||||
*/
|
*/
|
||||||
public static function YEAR($dateValue = 1)
|
public static function YEAR($dateValue = 1)
|
||||||
{
|
{
|
||||||
|
|
@ -799,7 +799,7 @@ class DateTime
|
||||||
* @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard time string
|
* PHP DateTime object, or a standard time string
|
||||||
*
|
*
|
||||||
* @return int|string Hour
|
* @return array|int|string Hour
|
||||||
*/
|
*/
|
||||||
public static function HOUROFDAY($timeValue = 0)
|
public static function HOUROFDAY($timeValue = 0)
|
||||||
{
|
{
|
||||||
|
|
@ -823,7 +823,7 @@ class DateTime
|
||||||
* @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard time string
|
* PHP DateTime object, or a standard time string
|
||||||
*
|
*
|
||||||
* @return int|string Minute
|
* @return array|int|string Minute
|
||||||
*/
|
*/
|
||||||
public static function MINUTE($timeValue = 0)
|
public static function MINUTE($timeValue = 0)
|
||||||
{
|
{
|
||||||
|
|
@ -847,7 +847,7 @@ class DateTime
|
||||||
* @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard time string
|
* PHP DateTime object, or a standard time string
|
||||||
*
|
*
|
||||||
* @return int|string Second
|
* @return array|int|string Second
|
||||||
*/
|
*/
|
||||||
public static function SECOND($timeValue = 0)
|
public static function SECOND($timeValue = 0)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,15 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
||||||
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
||||||
|
|
||||||
class DateParts
|
class DateParts
|
||||||
{
|
{
|
||||||
|
use ArrayEnabled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DAYOFMONTH.
|
* DAYOFMONTH.
|
||||||
*
|
*
|
||||||
|
|
@ -19,11 +22,18 @@ class DateParts
|
||||||
*
|
*
|
||||||
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard date string
|
* PHP DateTime object, or a standard date string
|
||||||
|
* Or can be an array of date values
|
||||||
*
|
*
|
||||||
* @return int|string Day of the month
|
* @return array|int|string Day of the month
|
||||||
|
* If an array of numbers is passed as the argument, then the returned result will also be an array
|
||||||
|
* with the same dimensions
|
||||||
*/
|
*/
|
||||||
public static function day($dateValue)
|
public static function day($dateValue)
|
||||||
{
|
{
|
||||||
|
if (is_array($dateValue)) {
|
||||||
|
return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue);
|
||||||
|
}
|
||||||
|
|
||||||
$weirdResult = self::weirdCondition($dateValue);
|
$weirdResult = self::weirdCondition($dateValue);
|
||||||
if ($weirdResult >= 0) {
|
if ($weirdResult >= 0) {
|
||||||
return $weirdResult;
|
return $weirdResult;
|
||||||
|
|
@ -52,11 +62,18 @@ class DateParts
|
||||||
*
|
*
|
||||||
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard date string
|
* PHP DateTime object, or a standard date string
|
||||||
|
* Or can be an array of date values
|
||||||
*
|
*
|
||||||
* @return int|string Month of the year
|
* @return array|int|string Month of the year
|
||||||
|
* If an array of numbers is passed as the argument, then the returned result will also be an array
|
||||||
|
* with the same dimensions
|
||||||
*/
|
*/
|
||||||
public static function month($dateValue)
|
public static function month($dateValue)
|
||||||
{
|
{
|
||||||
|
if (is_array($dateValue)) {
|
||||||
|
return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$dateValue = Helpers::getDateValue($dateValue);
|
$dateValue = Helpers::getDateValue($dateValue);
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
|
|
@ -83,11 +100,18 @@ class DateParts
|
||||||
*
|
*
|
||||||
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard date string
|
* PHP DateTime object, or a standard date string
|
||||||
|
* Or can be an array of date values
|
||||||
*
|
*
|
||||||
* @return int|string Year
|
* @return array|int|string Year
|
||||||
|
* If an array of numbers is passed as the argument, then the returned result will also be an array
|
||||||
|
* with the same dimensions
|
||||||
*/
|
*/
|
||||||
public static function year($dateValue)
|
public static function year($dateValue)
|
||||||
{
|
{
|
||||||
|
if (is_array($dateValue)) {
|
||||||
|
return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$dateValue = Helpers::getDateValue($dateValue);
|
$dateValue = Helpers::getDateValue($dateValue);
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,14 @@
|
||||||
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
||||||
|
|
||||||
use DateTimeImmutable;
|
use DateTimeImmutable;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
||||||
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
||||||
|
|
||||||
class DateValue
|
class DateValue
|
||||||
{
|
{
|
||||||
|
use ArrayEnabled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DATEVALUE.
|
* DATEVALUE.
|
||||||
*
|
*
|
||||||
|
|
@ -21,7 +24,7 @@ class DateValue
|
||||||
* Excel Function:
|
* Excel Function:
|
||||||
* DATEVALUE(dateValue)
|
* DATEVALUE(dateValue)
|
||||||
*
|
*
|
||||||
* @param string $dateValue Text that represents a date in a Microsoft Excel date format.
|
* @param array|string $dateValue Text that represents a date in a Microsoft Excel date format.
|
||||||
* For example, "1/30/2008" or "30-Jan-2008" are text strings within
|
* For example, "1/30/2008" or "30-Jan-2008" are text strings within
|
||||||
* quotation marks that represent dates. Using the default date
|
* quotation marks that represent dates. Using the default date
|
||||||
* system in Excel for Windows, date_text must represent a date from
|
* system in Excel for Windows, date_text must represent a date from
|
||||||
|
|
@ -29,12 +32,19 @@ class DateValue
|
||||||
* system in Excel for the Macintosh, date_text must represent a date
|
* system in Excel for the Macintosh, date_text must represent a date
|
||||||
* from January 1, 1904, to December 31, 9999. DATEVALUE returns the
|
* from January 1, 1904, to December 31, 9999. DATEVALUE returns the
|
||||||
* #VALUE! error value if date_text is out of this range.
|
* #VALUE! error value if date_text is out of this range.
|
||||||
|
* Or can be an array of date values
|
||||||
*
|
*
|
||||||
* @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object,
|
* @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object,
|
||||||
* depending on the value of the ReturnDateType flag
|
* depending on the value of the ReturnDateType flag
|
||||||
|
* If an array of numbers is passed as the argument, then the returned result will also be an array
|
||||||
|
* with the same dimensions
|
||||||
*/
|
*/
|
||||||
public static function fromString($dateValue)
|
public static function fromString($dateValue)
|
||||||
{
|
{
|
||||||
|
if (is_array($dateValue)) {
|
||||||
|
return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue);
|
||||||
|
}
|
||||||
|
|
||||||
$dti = new DateTimeImmutable();
|
$dti = new DateTimeImmutable();
|
||||||
$baseYear = SharedDateHelper::getExcelCalendar();
|
$baseYear = SharedDateHelper::getExcelCalendar();
|
||||||
$dateValue = trim(Functions::flattenSingleValue($dateValue ?? ''), '"');
|
$dateValue = trim(Functions::flattenSingleValue($dateValue ?? ''), '"');
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,15 @@
|
||||||
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
||||||
|
|
||||||
use DateTimeInterface;
|
use DateTimeInterface;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
||||||
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
||||||
|
|
||||||
class Days
|
class Days
|
||||||
{
|
{
|
||||||
|
use ArrayEnabled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DAYS.
|
* DAYS.
|
||||||
*
|
*
|
||||||
|
|
@ -17,15 +20,23 @@ class Days
|
||||||
* Excel Function:
|
* Excel Function:
|
||||||
* DAYS(endDate, startDate)
|
* DAYS(endDate, startDate)
|
||||||
*
|
*
|
||||||
* @param DateTimeInterface|float|int|string $endDate Excel date serial value (float),
|
* @param array|DateTimeInterface|float|int|string $endDate Excel date serial value (float),
|
||||||
* PHP date timestamp (integer), PHP DateTime object, or a standard date string
|
* PHP date timestamp (integer), PHP DateTime object, or a standard date string
|
||||||
* @param DateTimeInterface|float|int|string $startDate Excel date serial value (float),
|
* Or can be an array of date values
|
||||||
* PHP date timestamp (integer), PHP DateTime object, or a standard date string
|
* @param array|DateTimeInterface|float|int|string $startDate Excel date serial value (float),
|
||||||
|
* PHP date timestamp (integer), PHP DateTime object, or a standard date string
|
||||||
|
* Or can be an array of date values
|
||||||
*
|
*
|
||||||
* @return int|string Number of days between start date and end date or an error
|
* @return array|int|string Number of days between start date and end date or an error
|
||||||
|
* If an array of values is passed for the $startDate or $endDays,arguments, then the returned result
|
||||||
|
* will also be an array with matching dimensions
|
||||||
*/
|
*/
|
||||||
public static function between($endDate, $startDate)
|
public static function between($endDate, $startDate)
|
||||||
{
|
{
|
||||||
|
if (is_array($endDate) || is_array($startDate)) {
|
||||||
|
return self::evaluateArrayArguments([self::class, __FUNCTION__], $endDate, $startDate);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$startDate = Helpers::getDateValue($startDate);
|
$startDate = Helpers::getDateValue($startDate);
|
||||||
$endDate = Helpers::getDateValue($endDate);
|
$endDate = Helpers::getDateValue($endDate);
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,15 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
||||||
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
||||||
|
|
||||||
class Days360
|
class Days360
|
||||||
{
|
{
|
||||||
|
use ArrayEnabled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DAYS360.
|
* DAYS360.
|
||||||
*
|
*
|
||||||
|
|
@ -18,11 +21,13 @@ class Days360
|
||||||
* Excel Function:
|
* Excel Function:
|
||||||
* DAYS360(startDate,endDate[,method])
|
* DAYS360(startDate,endDate[,method])
|
||||||
*
|
*
|
||||||
* @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer),
|
* @param array|mixed $startDate Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard date string
|
* PHP DateTime object, or a standard date string
|
||||||
* @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer),
|
* Or can be an array of date values
|
||||||
|
* @param array|mixed $endDate Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard date string
|
* PHP DateTime object, or a standard date string
|
||||||
* @param mixed $method US or European Method as a bool
|
* Or can be an array of date values
|
||||||
|
* @param array|mixed $method US or European Method as a bool
|
||||||
* FALSE or omitted: U.S. (NASD) method. If the starting date is
|
* FALSE or omitted: U.S. (NASD) method. If the starting date is
|
||||||
* the last day of a month, it becomes equal to the 30th of the
|
* the last day of a month, it becomes equal to the 30th of the
|
||||||
* same month. If the ending date is the last day of a month and
|
* same month. If the ending date is the last day of a month and
|
||||||
|
|
@ -33,11 +38,18 @@ class Days360
|
||||||
* TRUE: European method. Starting dates and ending dates that
|
* TRUE: European method. Starting dates and ending dates that
|
||||||
* occur on the 31st of a month become equal to the 30th of the
|
* occur on the 31st of a month become equal to the 30th of the
|
||||||
* same month.
|
* same month.
|
||||||
|
* Or can be an array of methods
|
||||||
*
|
*
|
||||||
* @return int|string Number of days between start date and end date
|
* @return array|int|string Number of days between start date and end date
|
||||||
|
* If an array of values is passed for the $startDate or $endDays,arguments, then the returned result
|
||||||
|
* will also be an array with matching dimensions
|
||||||
*/
|
*/
|
||||||
public static function between($startDate = 0, $endDate = 0, $method = false)
|
public static function between($startDate = 0, $endDate = 0, $method = false)
|
||||||
{
|
{
|
||||||
|
if (is_array($endDate) || is_array($startDate) || is_array($method)) {
|
||||||
|
return self::evaluateArrayArguments([self::class, __FUNCTION__], $startDate, $endDate, $method);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$startDate = Helpers::getDateValue($startDate);
|
$startDate = Helpers::getDateValue($startDate);
|
||||||
$endDate = Helpers::getDateValue($endDate);
|
$endDate = Helpers::getDateValue($endDate);
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,15 @@
|
||||||
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
||||||
|
|
||||||
use DateTime;
|
use DateTime;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
||||||
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
||||||
|
|
||||||
class Time
|
class Time
|
||||||
{
|
{
|
||||||
|
use ArrayEnabled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TIME.
|
* TIME.
|
||||||
*
|
*
|
||||||
|
|
@ -20,23 +23,31 @@ class Time
|
||||||
* Excel Function:
|
* Excel Function:
|
||||||
* TIME(hour,minute,second)
|
* TIME(hour,minute,second)
|
||||||
*
|
*
|
||||||
* @param mixed $hour A number from 0 (zero) to 32767 representing the hour.
|
* @param array|int $hour A number from 0 (zero) to 32767 representing the hour.
|
||||||
* Any value greater than 23 will be divided by 24 and the remainder
|
* Any value greater than 23 will be divided by 24 and the remainder
|
||||||
* will be treated as the hour value. For example, TIME(27,0,0) =
|
* will be treated as the hour value. For example, TIME(27,0,0) =
|
||||||
* TIME(3,0,0) = .125 or 3:00 AM.
|
* TIME(3,0,0) = .125 or 3:00 AM.
|
||||||
* @param mixed $minute A number from 0 to 32767 representing the minute.
|
* @param array|int $minute A number from 0 to 32767 representing the minute.
|
||||||
* Any value greater than 59 will be converted to hours and minutes.
|
* Any value greater than 59 will be converted to hours and minutes.
|
||||||
* For example, TIME(0,750,0) = TIME(12,30,0) = .520833 or 12:30 PM.
|
* For example, TIME(0,750,0) = TIME(12,30,0) = .520833 or 12:30 PM.
|
||||||
* @param mixed $second A number from 0 to 32767 representing the second.
|
* @param array|int $second A number from 0 to 32767 representing the second.
|
||||||
* Any value greater than 59 will be converted to hours, minutes,
|
* Any value greater than 59 will be converted to hours, minutes,
|
||||||
* and seconds. For example, TIME(0,0,2000) = TIME(0,33,22) = .023148
|
* and seconds. For example, TIME(0,0,2000) = TIME(0,33,22) = .023148
|
||||||
* or 12:33:20 AM
|
* or 12:33:20 AM
|
||||||
|
* If an array of numbers is passed as the argument, then the returned result will also be an array
|
||||||
|
* with the same dimensions
|
||||||
*
|
*
|
||||||
* @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object,
|
* @return array|mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object,
|
||||||
* depending on the value of the ReturnDateType flag
|
* depending on the value of the ReturnDateType flag
|
||||||
|
* If an array of numbers is passed as the argument, then the returned result will also be an array
|
||||||
|
* with the same dimensions
|
||||||
*/
|
*/
|
||||||
public static function fromHMS($hour, $minute, $second)
|
public static function fromHMS($hour, $minute, $second)
|
||||||
{
|
{
|
||||||
|
if (is_array($hour) || is_array($minute) || is_array($second)) {
|
||||||
|
return self::evaluateArrayArguments([self::class, __FUNCTION__], $hour, $minute, $second);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$hour = self::toIntWithNullBool($hour);
|
$hour = self::toIntWithNullBool($hour);
|
||||||
$minute = self::toIntWithNullBool($minute);
|
$minute = self::toIntWithNullBool($minute);
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,15 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
||||||
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
||||||
|
|
||||||
class TimeParts
|
class TimeParts
|
||||||
{
|
{
|
||||||
|
use ArrayEnabled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* HOUROFDAY.
|
* HOUROFDAY.
|
||||||
*
|
*
|
||||||
|
|
@ -19,11 +22,18 @@ class TimeParts
|
||||||
*
|
*
|
||||||
* @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard time string
|
* PHP DateTime object, or a standard time string
|
||||||
|
* Or can be an array of date/time values
|
||||||
*
|
*
|
||||||
* @return int|string Hour
|
* @return array|int|string Hour
|
||||||
|
* If an array of numbers is passed as the argument, then the returned result will also be an array
|
||||||
|
* with the same dimensions
|
||||||
*/
|
*/
|
||||||
public static function hour($timeValue)
|
public static function hour($timeValue)
|
||||||
{
|
{
|
||||||
|
if (is_array($timeValue)) {
|
||||||
|
return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $timeValue);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$timeValue = Functions::flattenSingleValue($timeValue);
|
$timeValue = Functions::flattenSingleValue($timeValue);
|
||||||
Helpers::nullFalseTrueToNumber($timeValue);
|
Helpers::nullFalseTrueToNumber($timeValue);
|
||||||
|
|
@ -53,11 +63,18 @@ class TimeParts
|
||||||
*
|
*
|
||||||
* @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard time string
|
* PHP DateTime object, or a standard time string
|
||||||
|
* Or can be an array of date/time values
|
||||||
*
|
*
|
||||||
* @return int|string Minute
|
* @return array|int|string Minute
|
||||||
|
* If an array of numbers is passed as the argument, then the returned result will also be an array
|
||||||
|
* with the same dimensions
|
||||||
*/
|
*/
|
||||||
public static function minute($timeValue)
|
public static function minute($timeValue)
|
||||||
{
|
{
|
||||||
|
if (is_array($timeValue)) {
|
||||||
|
return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $timeValue);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$timeValue = Functions::flattenSingleValue($timeValue);
|
$timeValue = Functions::flattenSingleValue($timeValue);
|
||||||
Helpers::nullFalseTrueToNumber($timeValue);
|
Helpers::nullFalseTrueToNumber($timeValue);
|
||||||
|
|
@ -87,11 +104,18 @@ class TimeParts
|
||||||
*
|
*
|
||||||
* @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard time string
|
* PHP DateTime object, or a standard time string
|
||||||
|
* Or can be an array of date/time values
|
||||||
*
|
*
|
||||||
* @return int|string Second
|
* @return array|int|string Second
|
||||||
|
* If an array of numbers is passed as the argument, then the returned result will also be an array
|
||||||
|
* with the same dimensions
|
||||||
*/
|
*/
|
||||||
public static function second($timeValue)
|
public static function second($timeValue)
|
||||||
{
|
{
|
||||||
|
if (is_array($timeValue)) {
|
||||||
|
return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $timeValue);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$timeValue = Functions::flattenSingleValue($timeValue);
|
$timeValue = Functions::flattenSingleValue($timeValue);
|
||||||
Helpers::nullFalseTrueToNumber($timeValue);
|
Helpers::nullFalseTrueToNumber($timeValue);
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,14 @@
|
||||||
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
||||||
|
|
||||||
use Datetime;
|
use Datetime;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
||||||
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
||||||
|
|
||||||
class TimeValue
|
class TimeValue
|
||||||
{
|
{
|
||||||
|
use ArrayEnabled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TIMEVALUE.
|
* TIMEVALUE.
|
||||||
*
|
*
|
||||||
|
|
@ -21,16 +24,23 @@ class TimeValue
|
||||||
* Excel Function:
|
* Excel Function:
|
||||||
* TIMEVALUE(timeValue)
|
* TIMEVALUE(timeValue)
|
||||||
*
|
*
|
||||||
* @param string $timeValue A text string that represents a time in any one of the Microsoft
|
* @param array|string $timeValue A text string that represents a time in any one of the Microsoft
|
||||||
* Excel time formats; for example, "6:45 PM" and "18:45" text strings
|
* Excel time formats; for example, "6:45 PM" and "18:45" text strings
|
||||||
* within quotation marks that represent time.
|
* within quotation marks that represent time.
|
||||||
* Date information in time_text is ignored.
|
* Date information in time_text is ignored.
|
||||||
|
* Or can be an array of date/time values
|
||||||
*
|
*
|
||||||
* @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object,
|
* @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object,
|
||||||
* depending on the value of the ReturnDateType flag
|
* depending on the value of the ReturnDateType flag
|
||||||
|
* If an array of numbers is passed as the argument, then the returned result will also be an array
|
||||||
|
* with the same dimensions
|
||||||
*/
|
*/
|
||||||
public static function fromString($timeValue)
|
public static function fromString($timeValue)
|
||||||
{
|
{
|
||||||
|
if (is_array($timeValue)) {
|
||||||
|
return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $timeValue);
|
||||||
|
}
|
||||||
|
|
||||||
$timeValue = trim(Functions::flattenSingleValue($timeValue ?? ''), '"');
|
$timeValue = trim(Functions::flattenSingleValue($timeValue ?? ''), '"');
|
||||||
$timeValue = str_replace(['/', '.'], '-', $timeValue);
|
$timeValue = str_replace(['/', '.'], '-', $timeValue);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,15 @@
|
||||||
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
||||||
|
|
||||||
use DateTime;
|
use DateTime;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
||||||
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper;
|
||||||
|
|
||||||
class Week
|
class Week
|
||||||
{
|
{
|
||||||
|
use ArrayEnabled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* WEEKNUM.
|
* WEEKNUM.
|
||||||
*
|
*
|
||||||
|
|
@ -24,7 +27,8 @@ class Week
|
||||||
*
|
*
|
||||||
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard date string
|
* PHP DateTime object, or a standard date string
|
||||||
* @param int $method Week begins on Sunday or Monday
|
* Or can be an array of date values
|
||||||
|
* @param array|int $method Week begins on Sunday or Monday
|
||||||
* 1 or omitted Week begins on Sunday.
|
* 1 or omitted Week begins on Sunday.
|
||||||
* 2 Week begins on Monday.
|
* 2 Week begins on Monday.
|
||||||
* 11 Week begins on Monday.
|
* 11 Week begins on Monday.
|
||||||
|
|
@ -35,11 +39,18 @@ class Week
|
||||||
* 16 Week begins on Saturday.
|
* 16 Week begins on Saturday.
|
||||||
* 17 Week begins on Sunday.
|
* 17 Week begins on Sunday.
|
||||||
* 21 ISO (Jan. 4 is week 1, begins on Monday).
|
* 21 ISO (Jan. 4 is week 1, begins on Monday).
|
||||||
|
* Or can be an array of methods
|
||||||
*
|
*
|
||||||
* @return int|string Week Number
|
* @return array|int|string Week Number
|
||||||
|
* If an array of values is passed as the argument, then the returned result will also be an array
|
||||||
|
* with the same dimensions
|
||||||
*/
|
*/
|
||||||
public static function number($dateValue, $method = Constants::STARTWEEK_SUNDAY)
|
public static function number($dateValue, $method = Constants::STARTWEEK_SUNDAY)
|
||||||
{
|
{
|
||||||
|
if (is_array($dateValue) || is_array($method)) {
|
||||||
|
return self::evaluateArrayArguments([self::class, __FUNCTION__], $dateValue, $method);
|
||||||
|
}
|
||||||
|
|
||||||
$origDateValueNull = empty($dateValue);
|
$origDateValueNull = empty($dateValue);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
@ -88,11 +99,18 @@ class Week
|
||||||
*
|
*
|
||||||
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard date string
|
* PHP DateTime object, or a standard date string
|
||||||
|
* Or can be an array of date values
|
||||||
*
|
*
|
||||||
* @return int|string Week Number
|
* @return array|int|string Week Number
|
||||||
|
* If an array of numbers is passed as the argument, then the returned result will also be an array
|
||||||
|
* with the same dimensions
|
||||||
*/
|
*/
|
||||||
public static function isoWeekNumber($dateValue)
|
public static function isoWeekNumber($dateValue)
|
||||||
{
|
{
|
||||||
|
if (is_array($dateValue)) {
|
||||||
|
return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue);
|
||||||
|
}
|
||||||
|
|
||||||
if (self::apparentBug($dateValue)) {
|
if (self::apparentBug($dateValue)) {
|
||||||
return 52;
|
return 52;
|
||||||
}
|
}
|
||||||
|
|
@ -119,17 +137,25 @@ class Week
|
||||||
* Excel Function:
|
* Excel Function:
|
||||||
* WEEKDAY(dateValue[,style])
|
* WEEKDAY(dateValue[,style])
|
||||||
*
|
*
|
||||||
* @param null|float|int|string $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
* @param null|array|float|int|string $dateValue Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard date string
|
* PHP DateTime object, or a standard date string
|
||||||
|
* Or can be an array of date values
|
||||||
* @param mixed $style A number that determines the type of return value
|
* @param mixed $style A number that determines the type of return value
|
||||||
* 1 or omitted Numbers 1 (Sunday) through 7 (Saturday).
|
* 1 or omitted Numbers 1 (Sunday) through 7 (Saturday).
|
||||||
* 2 Numbers 1 (Monday) through 7 (Sunday).
|
* 2 Numbers 1 (Monday) through 7 (Sunday).
|
||||||
* 3 Numbers 0 (Monday) through 6 (Sunday).
|
* 3 Numbers 0 (Monday) through 6 (Sunday).
|
||||||
|
* Or can be an array of styles
|
||||||
*
|
*
|
||||||
* @return int|string Day of the week value
|
* @return array|int|string Day of the week value
|
||||||
|
* If an array of values is passed as the argument, then the returned result will also be an array
|
||||||
|
* with the same dimensions
|
||||||
*/
|
*/
|
||||||
public static function day($dateValue, $style = 1)
|
public static function day($dateValue, $style = 1)
|
||||||
{
|
{
|
||||||
|
if (is_array($dateValue) || is_array($style)) {
|
||||||
|
return self::evaluateArrayArguments([self::class, __FUNCTION__], $dateValue, $style);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$dateValue = Helpers::getDateValue($dateValue);
|
$dateValue = Helpers::getDateValue($dateValue);
|
||||||
$style = self::validateStyle($style);
|
$style = self::validateStyle($style);
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,14 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
||||||
|
|
||||||
class WorkDay
|
class WorkDay
|
||||||
{
|
{
|
||||||
|
use ArrayEnabled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* WORKDAY.
|
* WORKDAY.
|
||||||
*
|
*
|
||||||
|
|
@ -18,27 +21,37 @@ class WorkDay
|
||||||
* Excel Function:
|
* Excel Function:
|
||||||
* WORKDAY(startDate,endDays[,holidays[,holiday[,...]]])
|
* WORKDAY(startDate,endDays[,holidays[,holiday[,...]]])
|
||||||
*
|
*
|
||||||
* @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer),
|
* @param array|mixed $startDate Excel date serial value (float), PHP date timestamp (integer),
|
||||||
* PHP DateTime object, or a standard date string
|
* PHP DateTime object, or a standard date string
|
||||||
* @param int $endDays The number of nonweekend and nonholiday days before or after
|
* Or can be an array of date values
|
||||||
|
* @param array|int $endDays The number of nonweekend and nonholiday days before or after
|
||||||
* startDate. A positive value for days yields a future date; a
|
* startDate. A positive value for days yields a future date; a
|
||||||
* negative value yields a past date.
|
* negative value yields a past date.
|
||||||
|
* Or can be an array of int values
|
||||||
* @param mixed $dateArgs
|
* @param mixed $dateArgs
|
||||||
*
|
*
|
||||||
* @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object,
|
* @return array|mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object,
|
||||||
* depending on the value of the ReturnDateType flag
|
* depending on the value of the ReturnDateType flag
|
||||||
|
* If an array of values is passed for the $startDate or $endDays,arguments, then the returned result
|
||||||
|
* will also be an array with matching dimensions
|
||||||
*/
|
*/
|
||||||
public static function date($startDate, $endDays, ...$dateArgs)
|
public static function date($startDate, $endDays, ...$dateArgs)
|
||||||
{
|
{
|
||||||
|
if (is_array($startDate) || is_array($endDays)) {
|
||||||
|
return self::evaluateArrayArgumentsSubset(
|
||||||
|
[self::class, __FUNCTION__],
|
||||||
|
2,
|
||||||
|
$startDate,
|
||||||
|
$endDays,
|
||||||
|
...$dateArgs
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve the mandatory start date and days that are referenced in the function definition
|
// Retrieve the mandatory start date and days that are referenced in the function definition
|
||||||
try {
|
try {
|
||||||
$startDate = Helpers::getDateValue($startDate);
|
$startDate = Helpers::getDateValue($startDate);
|
||||||
$endDays = Helpers::validateNumericNull($endDays);
|
$endDays = Helpers::validateNumericNull($endDays);
|
||||||
$dateArgs = Functions::flattenArray($dateArgs);
|
$holidayArray = array_map([Helpers::class, 'getDateValue'], Functions::flattenArray($dateArgs));
|
||||||
$holidayArray = [];
|
|
||||||
foreach ($dateArgs as $holidayDate) {
|
|
||||||
$holidayArray[] = Helpers::getDateValue($holidayDate);
|
|
||||||
}
|
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
return $e->getMessage();
|
return $e->getMessage();
|
||||||
}
|
}
|
||||||
|
|
@ -64,9 +77,8 @@ class WorkDay
|
||||||
private static function incrementing(float $startDate, int $endDays, array $holidayArray)
|
private static function incrementing(float $startDate, int $endDays, array $holidayArray)
|
||||||
{
|
{
|
||||||
// Adjust the start date if it falls over a weekend
|
// Adjust the start date if it falls over a weekend
|
||||||
|
|
||||||
$startDoW = self::getWeekDay($startDate, 3);
|
$startDoW = self::getWeekDay($startDate, 3);
|
||||||
if (self::getWeekDay($startDate, 3) >= 5) {
|
if ($startDoW >= 5) {
|
||||||
$startDate += 7 - $startDoW;
|
$startDate += 7 - $startDoW;
|
||||||
--$endDays;
|
--$endDays;
|
||||||
}
|
}
|
||||||
|
|
@ -126,9 +138,8 @@ class WorkDay
|
||||||
private static function decrementing(float $startDate, int $endDays, array $holidayArray)
|
private static function decrementing(float $startDate, int $endDays, array $holidayArray)
|
||||||
{
|
{
|
||||||
// Adjust the start date if it falls over a weekend
|
// Adjust the start date if it falls over a weekend
|
||||||
|
|
||||||
$startDoW = self::getWeekDay($startDate, 3);
|
$startDoW = self::getWeekDay($startDate, 3);
|
||||||
if (self::getWeekDay($startDate, 3) >= 5) {
|
if ($startDoW >= 5) {
|
||||||
$startDate += -$startDoW + 4;
|
$startDate += -$startDoW + 4;
|
||||||
++$endDays;
|
++$endDays;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
||||||
|
|
||||||
use DateTimeImmutable;
|
use DateTimeImmutable;
|
||||||
use DateTimeInterface;
|
use DateTimeInterface;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel\DateValue;
|
use PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel\DateValue;
|
||||||
|
|
||||||
class DateValueTest extends AllSetupTeardown
|
class DateValueTest extends AllSetupTeardown
|
||||||
|
|
@ -72,4 +73,25 @@ class DateValueTest extends AllSetupTeardown
|
||||||
self::assertEquals('#VALUE!', DateValue::fromString('1903-12-31'));
|
self::assertEquals('#VALUE!', DateValue::fromString('1903-12-31'));
|
||||||
self::assertEquals('#VALUE!', DateValue::fromString('1900-02-29'));
|
self::assertEquals('#VALUE!', DateValue::fromString('1900-02-29'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerDateValueArray
|
||||||
|
*/
|
||||||
|
public function testDateValueArray(array $expectedResult, string $array): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
$formula = "=DATEVALUE({$array})";
|
||||||
|
$result = $calculation->_calculateFormulaValue($formula);
|
||||||
|
self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerDateValueArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'row vector' => [[[44562, 44724, 45129]], '{"2022-01-01", "2022-06-12", "2023-07-22"}'],
|
||||||
|
'column vector' => [[[44562], [44564], [44567]], '{"2022-01-01"; "2022-01-03"; "2022-01-06"}'],
|
||||||
|
'matrix' => [[[44562, 44571], [44788, 44926]], '{"2022-01-01", "2022-01-10"; "2022-08-15", "2022-12-31"}'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||||
|
|
||||||
class DayTest extends AllSetupTeardown
|
class DayTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
@ -41,4 +43,25 @@ class DayTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
return require 'tests/data/Calculation/DateTime/DAYOpenOffice.php';
|
return require 'tests/data/Calculation/DateTime/DAYOpenOffice.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerDayArray
|
||||||
|
*/
|
||||||
|
public function testDayArray(array $expectedResult, string $array): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
$formula = "=DAY({$array})";
|
||||||
|
$result = $calculation->_calculateFormulaValue($formula);
|
||||||
|
self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerDayArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'row vector' => [[[1, 12, 22]], '{"2022-01-01", "2022-06-12", "2023-07-22"}'],
|
||||||
|
'column vector' => [[[1], [3], [6]], '{"2022-01-01"; "2022-01-03"; "2022-01-06"}'],
|
||||||
|
'matrix' => [[[1, 10], [15, 31]], '{"2022-01-01", "2022-01-10"; "2022-08-15", "2022-12-31"}'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||||
|
|
||||||
class Days360Test extends AllSetupTeardown
|
class Days360Test extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
@ -23,4 +25,31 @@ class Days360Test extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
return require 'tests/data/Calculation/DateTime/DAYS360.php';
|
return require 'tests/data/Calculation/DateTime/DAYS360.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerDays360Array
|
||||||
|
*/
|
||||||
|
public function testDays360Array(array $expectedResult, string $startDate, string $endDate, ?string $methods): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
if ($methods === null) {
|
||||||
|
$formula = "=DAYS360({$startDate}, {$endDate})";
|
||||||
|
} else {
|
||||||
|
$formula = "=DAYS360({$startDate}, {$endDate}, {$methods})";
|
||||||
|
}
|
||||||
|
$result = $calculation->_calculateFormulaValue($formula);
|
||||||
|
self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerDays360Array(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'row vector #1' => [[[360, 199, -201]], '{"2022-01-01", "2022-06-12", "2023-07-22"}', '"2022-12-31"', null],
|
||||||
|
'column vector #1' => [[[360], [358], [355]], '{"2022-01-01"; "2022-01-03"; "2022-01-06"}', '"2022-12-31"', null],
|
||||||
|
'matrix #1' => [[[0, -9], [-224, -360]], '{"2022-01-01", "2022-01-10"; "2022-08-15", "2022-12-31"}', '"2021-12-31"', null],
|
||||||
|
'column vector with methods' => [[[360, 359], [358, 357], [355, 354]], '{"2022-01-01"; "2022-01-03"; "2022-01-06"}', '"2022-12-31"', '{FALSE, TRUE}'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use DateTimeImmutable;
|
use DateTimeImmutable;
|
||||||
use Exception;
|
use Exception;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel\Days;
|
use PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel\Days;
|
||||||
|
|
||||||
class DaysTest extends AllSetupTeardown
|
class DaysTest extends AllSetupTeardown
|
||||||
|
|
@ -42,4 +43,25 @@ class DaysTest extends AllSetupTeardown
|
||||||
$obj2 = new DateTimeImmutable('2000-2-29');
|
$obj2 = new DateTimeImmutable('2000-2-29');
|
||||||
self::assertSame('#VALUE!', Days::between($obj1, $obj2));
|
self::assertSame('#VALUE!', Days::between($obj1, $obj2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerDaysArray
|
||||||
|
*/
|
||||||
|
public function testDaysArray(array $expectedResult, string $startDate, string $endDate): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
$formula = "=DAYS({$startDate}, {$endDate})";
|
||||||
|
$result = $calculation->_calculateFormulaValue($formula);
|
||||||
|
self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerDaysArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'row vector #1' => [[[-364, -202, 203]], '{"2022-01-01", "2022-06-12", "2023-07-22"}', '"2022-12-31"'],
|
||||||
|
'column vector #1' => [[[-364], [-362], [-359]], '{"2022-01-01"; "2022-01-03"; "2022-01-06"}', '"2022-12-31"'],
|
||||||
|
'matrix #1' => [[[1, 10], [227, 365]], '{"2022-01-01", "2022-01-10"; "2022-08-15", "2022-12-31"}', '"2021-12-31"'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||||
|
|
||||||
class HourTest extends AllSetupTeardown
|
class HourTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
@ -22,4 +24,25 @@ class HourTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
return require 'tests/data/Calculation/DateTime/HOUR.php';
|
return require 'tests/data/Calculation/DateTime/HOUR.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerHourArray
|
||||||
|
*/
|
||||||
|
public function testHourArray(array $expectedResult, string $array): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
$formula = "=HOUR({$array})";
|
||||||
|
$result = $calculation->_calculateFormulaValue($formula);
|
||||||
|
self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerHourArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'row vector' => [[[1, 13, 19]], '{"2022-02-09 01:02:03", "2022-02-09 13:14:15", "2022-02-09 19:20:21"}'],
|
||||||
|
'column vector' => [[[1], [13], [19]], '{"2022-02-09 01:02:03"; "2022-02-09 13:14:15"; "2022-02-09 19:20:21"}'],
|
||||||
|
'matrix' => [[[1, 13], [19, 23]], '{"2022-02-09 01:02:03", "2022-02-09 13:14:15"; "2022-02-09 19:20:21", "1999-12-31 23:59:59"}'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||||
|
|
||||||
class IsoWeekNumTest extends AllSetupTeardown
|
class IsoWeekNumTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
@ -44,4 +46,25 @@ class IsoWeekNumTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
return require 'tests/data/Calculation/DateTime/ISOWEEKNUM1904.php';
|
return require 'tests/data/Calculation/DateTime/ISOWEEKNUM1904.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerIsoWeekNumArray
|
||||||
|
*/
|
||||||
|
public function testIsoWeekNumArray(array $expectedResult, string $array): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
$formula = "=ISOWEEKNUM({$array})";
|
||||||
|
$result = $calculation->_calculateFormulaValue($formula);
|
||||||
|
self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerIsoWeekNumArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'row vector' => [[[52, 23, 29]], '{"2022-01-01", "2022-06-12", "2023-07-22"}'],
|
||||||
|
'column vector' => [[[52], [13], [26]], '{"2023-01-01"; "2023-04-01"; "2023-07-01"}'],
|
||||||
|
'matrix' => [[[53, 52], [52, 52]], '{"2021-01-01", "2021-12-31"; "2023-01-01", "2023-12-31"}'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||||
|
|
||||||
class MinuteTest extends AllSetupTeardown
|
class MinuteTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
@ -22,4 +24,25 @@ class MinuteTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
return require 'tests/data/Calculation/DateTime/MINUTE.php';
|
return require 'tests/data/Calculation/DateTime/MINUTE.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerMinuteArray
|
||||||
|
*/
|
||||||
|
public function testMinuteArray(array $expectedResult, string $array): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
$formula = "=MINUTE({$array})";
|
||||||
|
$result = $calculation->_calculateFormulaValue($formula);
|
||||||
|
self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerMinuteArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'row vector' => [[[2, 14, 20]], '{"2022-02-09 01:02:03", "2022-02-09 13:14:15", "2022-02-09 19:20:21"}'],
|
||||||
|
'column vector' => [[[2], [14], [20]], '{"2022-02-09 01:02:03"; "2022-02-09 13:14:15"; "2022-02-09 19:20:21"}'],
|
||||||
|
'matrix' => [[[2, 14], [20, 59]], '{"2022-02-09 01:02:03", "2022-02-09 13:14:15"; "2022-02-09 19:20:21", "1999-12-31 23:59:59"}'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||||
|
|
||||||
class MonthTest extends AllSetupTeardown
|
class MonthTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
@ -22,4 +24,25 @@ class MonthTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
return require 'tests/data/Calculation/DateTime/MONTH.php';
|
return require 'tests/data/Calculation/DateTime/MONTH.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerMonthArray
|
||||||
|
*/
|
||||||
|
public function testMonthArray(array $expectedResult, string $array): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
$formula = "=MONTH({$array})";
|
||||||
|
$result = $calculation->_calculateFormulaValue($formula);
|
||||||
|
self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerMonthArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'row vector' => [[[1, 6, 1]], '{"2022-01-01", "2022-06-01", "2023-01-01"}'],
|
||||||
|
'column vector' => [[[1], [3], [6]], '{"2022-01-01"; "2022-03-01"; "2022-06-01"}'],
|
||||||
|
'matrix' => [[[1, 4], [8, 12]], '{"2022-01-01", "2022-04-01"; "2022-08-01", "2022-12-01"}'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||||
|
|
||||||
class SecondTest extends AllSetupTeardown
|
class SecondTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
@ -22,4 +24,25 @@ class SecondTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
return require 'tests/data/Calculation/DateTime/SECOND.php';
|
return require 'tests/data/Calculation/DateTime/SECOND.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerSecondArray
|
||||||
|
*/
|
||||||
|
public function testSecondArray(array $expectedResult, string $array): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
$formula = "=SECOND({$array})";
|
||||||
|
$result = $calculation->_calculateFormulaValue($formula);
|
||||||
|
self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerSecondArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'row vector' => [[[3, 15, 21]], '{"2022-02-09 01:02:03", "2022-02-09 13:14:15", "2022-02-09 19:20:21"}'],
|
||||||
|
'column vector' => [[[3], [15], [21]], '{"2022-02-09 01:02:03"; "2022-02-09 13:14:15"; "2022-02-09 19:20:21"}'],
|
||||||
|
'matrix' => [[[3, 15], [21, 59]], '{"2022-02-09 01:02:03", "2022-02-09 13:14:15"; "2022-02-09 19:20:21", "1999-12-31 23:59:59"}'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,9 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel\Time;
|
use PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel\Time;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
|
||||||
|
|
||||||
class TimeTest extends AllSetupTeardown
|
class TimeTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
|
|
@ -60,4 +62,95 @@ class TimeTest extends AllSetupTeardown
|
||||||
$result = Time::fromHMS(0, 0, 0);
|
$result = Time::fromHMS(0, 0, 0);
|
||||||
self::assertEquals(0, $result);
|
self::assertEquals(0, $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerTimeArray
|
||||||
|
*/
|
||||||
|
public function testTimeArray(array $expectedResult, string $hour, string $minute, string $second): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
$formula = "=TIME({$hour}, {$minute}, {$second})";
|
||||||
|
$result = $calculation->_calculateFormulaValue($formula);
|
||||||
|
self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerTimeArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'row vector hour' => [[[0.250706018518519, 0.50070601851852, 0.75070601851852]], '{6,12,18}', '1', '1'],
|
||||||
|
'column vector hour' => [[[0.250706018518519], [0.50070601851852], [0.75070601851852]], '{6;12;18}', '1', '1'],
|
||||||
|
'matrix hour' => [[[0.250706018518519, 0.50070601851852], [0.75070601851852, 0.95903935185185]], '{6,12;18,23}', '1', '1'],
|
||||||
|
'row vector minute' => [[[0.96667824074074, 0.97501157407407, 0.98334490740741, 0.99931712962963]], '23', '{12, 24, 36, 59}', '1'],
|
||||||
|
'column vector minute' => [[[0.96734953703704], [0.97568287037037], [0.98401620370370], [0.99998842592593]], '23', '{12; 24; 36; 59}', '59'],
|
||||||
|
'matrix minute' => [[[0.50833333333333, 0.51666666666667], [0.52083333333333, 0.5]], '12', '{12, 24; 30, 0}', '0'],
|
||||||
|
'row vector second' => [[[0.50069444444444, 0.50137731481481]], '12', '1', '{0,59}'],
|
||||||
|
'column vector second' => [[[0.99930555555556], [0.99998842592593]], '23', '59', '{0;59}'],
|
||||||
|
'vectors hour and minute' => [
|
||||||
|
[
|
||||||
|
[0.87570601851852, 0.88473379629630, 0.89376157407407, 0.90626157407407],
|
||||||
|
[0.91737268518519, 0.92640046296296, 0.93542824074074, 0.94792824074074],
|
||||||
|
[0.95903935185185, 0.96806712962963, 0.97709490740741, 0.98959490740741],
|
||||||
|
],
|
||||||
|
'{21;22;23}',
|
||||||
|
'{1, 14, 27, 45}',
|
||||||
|
'1',
|
||||||
|
],
|
||||||
|
'vectors hour and second' => [
|
||||||
|
[
|
||||||
|
[0.126041666666667, 0.126215277777778],
|
||||||
|
[0.334375, 0.33454861111111],
|
||||||
|
[0.584375, 0.58454861111111],
|
||||||
|
],
|
||||||
|
'{3;8;14}',
|
||||||
|
'1',
|
||||||
|
'{30,45}',
|
||||||
|
],
|
||||||
|
'vectors minute and second' => [
|
||||||
|
[
|
||||||
|
[0.75833333333333, 0.75834490740741],
|
||||||
|
[0.76041666666667, 0.76042824074074],
|
||||||
|
[0.77083333333333, 0.77084490740741],
|
||||||
|
[0.75, 0.750011574074074],
|
||||||
|
],
|
||||||
|
'18',
|
||||||
|
'{12; 15; 30; 0}',
|
||||||
|
'{0,1}',
|
||||||
|
],
|
||||||
|
'matrices hour and minute' => [
|
||||||
|
[
|
||||||
|
[0.25070601851852, 0.50278935185185],
|
||||||
|
[0.75487268518519, 0.96528935185185],
|
||||||
|
],
|
||||||
|
'{6, 12; 18, 23}',
|
||||||
|
'{1, 4; 7, 10}',
|
||||||
|
'1',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerTimeArrayException
|
||||||
|
*/
|
||||||
|
public function testTimeArrayException(string $hour, string $minute, string $second): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
$this->expectException(Exception::class);
|
||||||
|
$this->expectExceptionMessage('Formulae with more than two array arguments are not supported');
|
||||||
|
|
||||||
|
$formula = "=TIME({$hour}, {$minute}, {$second})";
|
||||||
|
$calculation->_calculateFormulaValue($formula);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerTimeArrayException(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'matrix arguments with 3 array values' => [
|
||||||
|
'{6, 12; 16, 23}',
|
||||||
|
'{1, 4; 7, 10}',
|
||||||
|
'{0,1}',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel\TimeValue;
|
use PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel\TimeValue;
|
||||||
|
|
||||||
class TimeValueTest extends AllSetupTeardown
|
class TimeValueTest extends AllSetupTeardown
|
||||||
|
|
@ -48,4 +49,25 @@ class TimeValueTest extends AllSetupTeardown
|
||||||
// ... with the correct value
|
// ... with the correct value
|
||||||
self::assertEquals($result->format('H:i:s'), '07:30:20');
|
self::assertEquals($result->format('H:i:s'), '07:30:20');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerTimeValueArray
|
||||||
|
*/
|
||||||
|
public function testTimeValueArray(array $expectedResult, string $array): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
$formula = "=TIMEVALUE({$array})";
|
||||||
|
$result = $calculation->_calculateFormulaValue($formula);
|
||||||
|
self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerTimeValueArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'row vector' => [[[0.04309027777777, 0.5515625, 0.80579861111111]], '{"2022-02-09 01:02:03", "2022-02-09 13:14:15", "2022-02-09 19:20:21"}'],
|
||||||
|
'column vector' => [[[0.04309027777777], [0.5515625], [0.80579861111111]], '{"2022-02-09 01:02:03"; "2022-02-09 13:14:15"; "2022-02-09 19:20:21"}'],
|
||||||
|
'matrix' => [[[0.04309027777777, 0.5515625], [0.80579861111111, 0.99998842592592]], '{"2022-02-09 01:02:03", "2022-02-09 13:14:15"; "2022-02-09 19:20:21", "1999-12-31 23:59:59"}'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||||
use PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel\Week;
|
use PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel\Week;
|
||||||
|
|
||||||
class WeekDayTest extends AllSetupTeardown
|
class WeekDayTest extends AllSetupTeardown
|
||||||
|
|
@ -32,4 +33,27 @@ class WeekDayTest extends AllSetupTeardown
|
||||||
self::assertEquals(6, Week::day('1904-01-01'));
|
self::assertEquals(6, Week::day('1904-01-01'));
|
||||||
self::assertEquals(6, Week::day(null));
|
self::assertEquals(6, Week::day(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerWeekDayArray
|
||||||
|
*/
|
||||||
|
public function testWeekDayArray(array $expectedResult, string $dateValues, string $styles): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
$formula = "=WEEKDAY({$dateValues}, {$styles})";
|
||||||
|
$result = $calculation->_calculateFormulaValue($formula);
|
||||||
|
self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerWeekDayArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'row vector #1' => [[[7, 1, 7]], '{"2022-01-01", "2022-06-12", "2023-07-22"}', '1'],
|
||||||
|
'column vector #1' => [[[1], [7], [7]], '{"2023-01-01"; "2023-04-01"; "2023-07-01"}', '1'],
|
||||||
|
'matrix #1' => [[[6, 6], [1, 1]], '{"2021-01-01", "2021-12-31"; "2023-01-01", "2023-12-31"}', '1'],
|
||||||
|
'row vector #2' => [[[7, 6]], '"2022-01-01"', '{1, 2}'],
|
||||||
|
'column vector #2' => [[[1], [7]], '"2023-01-01"', '{1; 2}'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||||
|
|
||||||
class WeekNumTest extends AllSetupTeardown
|
class WeekNumTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
@ -42,4 +44,28 @@ class WeekNumTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
return require 'tests/data/Calculation/DateTime/WEEKNUM1904.php';
|
return require 'tests/data/Calculation/DateTime/WEEKNUM1904.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerWeekNumArray
|
||||||
|
*/
|
||||||
|
public function testWeekNumArray(array $expectedResult, string $dateValues, string $methods): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
$formula = "=WEEKNUM({$dateValues}, {$methods})";
|
||||||
|
$result = $calculation->_calculateFormulaValue($formula);
|
||||||
|
self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerWeekNumArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'row vector #1' => [[[1, 25, 29]], '{"2022-01-01", "2022-06-12", "2023-07-22"}', '1'],
|
||||||
|
'column vector #1' => [[[1], [13], [26]], '{"2023-01-01"; "2023-04-01"; "2023-07-01"}', '1'],
|
||||||
|
'matrix #1' => [[[1, 53], [1, 53]], '{"2021-01-01", "2021-12-31"; "2023-01-01", "2023-12-31"}', '1'],
|
||||||
|
'row vector #2' => [[[25, 24]], '"2022-06-12"', '{1, 2}'],
|
||||||
|
'column vector #2' => [[[13], [14]], '"2023-04-01"', '{1; 2}'],
|
||||||
|
'matrix #2' => [[[53, 53], [53, 52]], '"2021-12-31"', '{1, 2; 16, 21}'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\DateTime;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||||
|
|
||||||
class YearTest extends AllSetupTeardown
|
class YearTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
@ -22,4 +24,25 @@ class YearTest extends AllSetupTeardown
|
||||||
{
|
{
|
||||||
return require 'tests/data/Calculation/DateTime/YEAR.php';
|
return require 'tests/data/Calculation/DateTime/YEAR.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerYearArray
|
||||||
|
*/
|
||||||
|
public function testYearArray(array $expectedResult, string $array): void
|
||||||
|
{
|
||||||
|
$calculation = Calculation::getInstance();
|
||||||
|
|
||||||
|
$formula = "=YEAR({$array})";
|
||||||
|
$result = $calculation->_calculateFormulaValue($formula);
|
||||||
|
self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerYearArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'row vector' => [[[2021, 2022, 2023]], '{"2021-01-01", "2022-01-01", "2023-01-01"}'],
|
||||||
|
'column vector' => [[[2021], [2022], [2023]], '{"2021-01-01"; "2022-01-01"; "2023-01-01"}'],
|
||||||
|
'matrix' => [[[2021, 2022], [2023, 1999]], '{"2021-01-01", "2022-01-01"; "2023-01-01", "1999-12-31"}'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue