43

I'm certainly trying to achieve something weird here, but I want to fake the date locally for a shell session on GNU/Linux. I need to black-box test how a program behaves at different dates, and modifying the system-wide date can have unwanted side effects (cron jobs, messed up logs, etc).

Any ideas ?

5 Answers 5

43

You can just use executable faketime (from ubuntu repositories sudo apt-get install faketime) by:

faketime -f "-15d" date

Or even fake time in whole shell by

faketime -f "-15d" bash -l
5
  • 1
    Kyle Brant posted pretty much this answer back in 2010. Please edit your answer to expand on it in some way that makes it substantially different from the existing answers.
    – user
    Jan 9, 2015 at 13:06
  • 6
    My solution is much easier than using library preload as Kyle Brant answered because location of libfaketime .so file is very specific and depends on linux distribution and package managers.
    – abonec
    Jan 9, 2015 at 13:40
  • 4
    @MichaelKjörling This answer is not at all the same as Kyle Brant's.
    – user173755
    Feb 8, 2017 at 17:40
  • 1
    @MichaelKjörling This answer is significantly easier than Kyle Brant's.
    – Ken Sharp
    Aug 10, 2017 at 22:39
  • I support this answer :-) Oct 24, 2020 at 14:17
30

Haven't tried this one out yet. But if this is current is looks like someone already wrote the library you can preload with libfaketime.

The basic usage is:

user@host> LD_PRELOAD=/usr/local/lib/libfaketime.so.1 FAKETIME="-15d" date
Mon Nov  8 12:01:12 CEST 2007

You can use ltrace to make sure all the time functions your application uses are covered.

0
7

You can set the TZ variable to an oddball value.

$ date
Tue May  4 06:24:43 CDT 2010
$ date -u
Tue May  4 11:24:47 UTC 2010
$ export TZ='CDT-3:12'
$ date
Tue May  4 14:36:53 CDT 2010
$ export TZ='CDT+5:37'
$ date
Tue May  4 05:48:00 CDT 2010
2
  • 1
    Clever trick, but it only modifies the timezone, so this way you are limited to [-12 hours,+11 hours] range.
    – nicoulaj
    May 4, 2010 at 14:04
  • 3
    @nicoulaj date Thu Aug 9 12:12:50 CDT 2018, ` TZ='UTC+120:00' date Sat Aug 4 09:00:47 UTC 2018, TZ='UTC-120:00' date Tue Aug 14 09:01:41 UTC 2018`. Roughly +- one week. Aug 9, 2018 at 9:01
3

You might be able to preload a library that has an alternative time() implementation.

2
  • 1
    Depending on how the program(s) access current time, you might have to preload alternative implementations of gettimeofday, clock_gettime, and/or possibly others as well, but yes, I've used this approach with success before. May 4, 2010 at 11:37
  • It's a Java program, and it seems to work well with libfaketime.
    – nicoulaj
    May 4, 2010 at 14:29
0

datefudge is an alternative to libfaketime.

It's used like so:

datefudge "2020-01-01 12:00" bash

to change the running shell to noon 1st of January 2020

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .