I recently did. To get a precise answer, I would have to keep some form of log of when I start sitting in front of my machine, and of when I leave or get interrupted. Doing so manually I know for sure I won't have the discipline. Where I, however, do have the discipline is to lock the screen whenever I stop staring at the screen for whatever reason. So that's a good point to measure. I keep daily records (hence I can clean up easily any files I don't want to draw any conclusions any more); to avoid any strange effects when staying up after midnight, I start logical days at 4am. So I changed the key binding for xlock to, additionally, execute
echo `gdate +%s` xlock >> $HOME/timelog/`gdate -d '4 hours ago' +%Y.%m.%d`before calling xlock, and a corresponding unlock-entry afterwards; similar logs in my .xsession before and after the line running the window manager. (gdate is just the GNU variant of the date utility, usually called date on GNU/Linux systems.)
To sum up the time, I use the following script that deliberately ignores the activities over the change of the (logical) day. On the one hand, this (hopefully) is "I enjoy a relaxing time away from the machine" and, on the other hand, it is interesting to know the total time from the first to the last interaction with a computer on every day (providing, e.g., a lower bound on the time I spend awake). In fact, I have several screen-locking keys keeping track of which activity saved me from spending even more time in front of the machine.
#!/usr/bin/perl -w my $path = $ENV{'HOME'} . "/timelog/"; my $logicalday = '4 hours ago'; my %times = (); if (@ARGV == 0) { my $now = `gdate -d '$logicalday' +%Y.%m.%d`; doday($now, 1); dooutput(); } elsif ($ARGV[0] eq "week") { my $dow = `gdate -d '$logicalday' +%w`; chomp($dow); for (my $i = 0; $i <= $dow; $i++) { my $ago = $dow - $i; my $day = `gdate -d '$ago days ago $logicalday' +%Y.%m.%d`; chomp($day); if ($ago > 0) { doday($day, 0); } else { doday($day, 1); } } dooutput(); } elsif ($ARGV[0] eq "lastweek") { my $dow = `gdate -d '$logicalday' +%w`; chomp($dow); for (my $i = 7; $i > 0; $i--) { my $ago = $i + $dow; my $day = `gdate -d '$ago days ago $logicalday' +%Y.%m.%d`; chomp($day); doday($day, 0); } dooutput(); } sub doday { my ($date, $istoday) = @_; chomp($date); open(my $file, "<", $path . $date) or return; my ($start, $current); foreach (<$file>) { my $line = $_; chomp($line); $line =~ /^([0-9]+) (.+)$/ or next; my ($time, $event) = ($1, $2); defined($start) and defined($current) and do { defined($times{$current}) or $times{$current} = 0; $times{$current} += $time - $start; }; $start = $time; $current = $event; } $istoday and defined($start) and defined($current) and do { my $time = `gdate +%s`; chomp($time); defined($times{$current}) or $times{$current} = 0; $times{$current} += $time - $start; }; } sub dooutput { foreach(sort(keys %times)) { printf "%-15s %5.1f h\n", $_, $times{$_} / 3600.0; } }