---
name: "Test::MockTime::DateCalc"
section: "3pm"
platform: "linux"
package: "libtest-mocktime-datecalc-perl"
version: "7+ds-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Test::MockTime::DateCalc"
---

# Test::MockTime::DateCalc(3pm)

## NAME

Test::MockTime::DateCalc -- fake time for Date::Calc functions

## SYNOPSIS

```
 use Test::MockTime;
 use Test::MockTime::DateCalc; # before Date::Calc loads
 # ...
 use My::Module::Using::Date::Calc;
```

## DESCRIPTION

`"Test::MockTime::DateCalc"` arranges for the functions in `"Date::Calc"` to follow the Perl level `"time()"` function (see perlfunc) and in particular any fake date/time set there by `"Test::MockTime"`.  The following `"Date::Calc"` functions are changed

```
    System_Clock
    Today
    Now
    Today_and_Now
    This_Year
    Gmtime
    Localtime
    Timezone
    Time_to_Date
```

`"Gmtime"`, `"Localtime"`, `"Timezone"` and `"Time_to_Date"` are made to default to the Perl-level current `"time()"`.  When called with an explicit time argument, they're unchanged.

### Module Load Order

`"Test::MockTime"` or similar fakery must be loaded first, before anything with a `"time()"` call, which includes `"Test::MockTime::DateCalc"`.  This is the same as for any `"CORE::GLOBAL"` override, see "OVERRIDING CORE FUNCTIONS" in CORE.

`"Test::MockTime::DateCalc"` must be loaded before `"Date::Calc"`.  If `"Date::Calc"` is already loaded then its functions might have been imported into other modules and such imports are not affected by the redefinitions made.  For that reason, `"Test::MockTime::DateCalc"` demands it be the one to load `"Date::Calc"` for the first time.  Usually this simply means having `"Test::MockTime::DateCalc"` at the start of a test script, before the things you're going to test.

```
    use strict;
    use warnings;
    use Test::MockTime ':all';
    use Test::MockTime::DateCalc;
    use My::Foo::Bar;
    set_fixed_time('1981-01-01T00:00:00Z');
    is (My::Foo::Bar::something(), 1981);
    restore_time();
```

In a test script, it's often good to have your own modules early to check they correctly load their pre-requisites.  You might want a separate test script for that so as not to accidentally rely on `"Test::MockTime::DateCalc"` loading `"Date::Calc"`.

### Other Faking Modules

`"Test::MockTime::DateCalc"` can be used with other modules which mangle the Perl-level `"time"` too.  For example `"Time::Fake"`,

```
    use Time::Fake;                # fakery first
    use Test::MockTime::DateCalc;
```

Or `"Time::Mock"`,

```
    use Time::Mock;                # fakery first
    use Test::MockTime::DateCalc;
```

`"Time::Warp"` (as of version 0.5) only exports a new `"time"`, it's not a core override and so can't be used with `"Test::MockTime::DateCalc"`.

## SEE ALSO

Date::Calc, Test::MockTime, Time::Fake, Time::Mock

[**faketime**(1)](/faketime/1.md)

## HOME PAGE

http://user42.tuxfamily.org/test-mocktime-datecalc/index.html

## COPYRIGHT

Copyright 2009, 2010, 2011, 2019 Kevin Ryde

Test-MockTime-DateCalc is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.

Test-MockTime-DateCalc is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with Test-MockTime-DateCalc.  If not, see \<http://www.gnu.org/licenses/\>.
