---
name: "datefudge"
section: "1"
platform: "linux"
package: "datefudge"
version: "1.27"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/datefudge"
---

# datefudge(1)

pretend the system time is different

## NAME

datefudge - pretend the system time is different

## SYNOPSIS

**datefudge** \[**-s**\|**--static**\] \[**-l**\|**--add-ld-preload** *lib*\] *at\_date program* \[*arguments* ...\]

## DESCRIPTION

**datefudge** is a small utility that pretends that the system time is different by pre-loading a small library which modifies the [**time**(2)](/time/2.md), [**gettimeofday**(2)](/gettimeofday/2.md) and [**clock\_gettime**(2)](/clock_gettime/2.md) system calls.

## DATE FORMAT

The *at\_date* argument can be given in any format accepted by the [**date**(1)](/date/1.md) program, for example "2007-04-01 12:21" or "yesterday", or "next Friday".

## OPTIONS

- **--static**, **-s**

  Mark the date as a \`static' one.  The above mentioned system calls will always return the date given in the *at\_date* argument, regardless of time passing.  Please note that sub-seconds part of the returned date is always set to 0. See EXAMPLES below.

- **--add-ld-preload** *lib*, **-l** *lib*

  Prepend *lib* to *LD\_PRELOAD* environment variable before executing given *program*.  This option might be useful for example to inject sanitizer libraries (e.g. from Address Sanitizer) to the list of preloaded libraries before the internal **datefudge**'s library.  See EXAMPLES below.

- **--help**, **-h**

  Print short usage information and exit.

- **--version**, **-v**

  Print version information and exit.

## EXAMPLES

### Basic examples:

```
$ datefudge "2007-04-01 10:23" date -R
Sun, 01 Apr 2007 10:23:00 +0200
$ datefudge "1 May 2007" date -R
Tue, 01 May 2007 00:00:00 +0200
$ datefudge "2 weeks ago" date -R
Wed, 16 Jan 2008 13:32:12 +0100
```

### Non-static vs. static example:

```
$ datefudge "2007-04-01 10:23" sh -c "sleep 3; date -R"
Sun, 01 Apr 2007 10:23:03 +0200
$ datefudge --static "2007-04-01 10:23" sh -c "sleep 3; date -R"
Sun, 01 Apr 2007 10:23:00 +0200
```

### Non-static with sub-seconds example:

```
$ datefudge --static "2007-04-01 10:23:45.123456" date +"%F %T %N"
2007-04-01 10:23:45 000000000
```

### Prepending LD\_PRELOAD example:

```
$ datefudge --add-ld-preload /path/to/libclang_rt.asan-x86_64.so "2007-04-01 10:23" command
If the command was compiled by 'clang -fsanitize=address -shared-libasan', then the above
command might display some errors, for example:
==7625==ERROR: AddressSanitizer: heap-use-after-free on address 0x614000000044 at pc ....
Without the --add-ld-preload argument, this would not work at all.
```

## AUTHOR

Written by Matthias Urlichs \<smurf@noris.de\>.  Modified by Robert Luberda \<robert@debian.org\>.

## BUGS

There is no attempt to make this change undetectable by the program. In particular, file modification times are **not** modified.  (Note that such a functionality might be provided by [**faketime**(1)](/faketime/1.md) program available in libfaketime Debian package.)

On systems using 32-bit representation of time, **datefudge** is affected by the year 2038 problem, which might cause dates to be wrapped around, for instance:

```
$ TZ=UTC datefudge "2038-01-19 03:14:07" sh -c "sleep 1; date -R"
Fri Dec 13 20:45:53 UTC 1901
```

## COPYRIGHT

Copyright © 2003 by Matthias Urlichs.\
 Copyright © 2008-2024 by Robert Luberda.

There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  You may redistribute copies of datefudge under the terms of the GNU General Public License.\
 For more information about these matters, see the file named COPYING.

## SEE ALSO

[**date**(1)](/date/1.md), [**ld.so**(1)](/ld.so/1.md), [**time**(2)](/time/2.md), [**gettimeofday**(2)](/gettimeofday/2.md), [**clock\_gettime**(2)](/clock_gettime/2.md), [**faketime**(1)](/faketime/1.md)
