Name a Day Mon|Tue|Wed and Get Date in Previous Week

Posted by jonathan on October 18, 2006

I use this command-line UNIX utility for generating filenames when I know that a, sayyy, audio stream was generated in the previous week, but I only know the day …

Usage: `datep sun`
prints: 20061015 which in this case is a couple days previous to the current day. Perfect for when you want a filename friendly date from yesterday or before.

This may be backticked into any other command for generating filenames, etc. Use at your own-risk. Use ‘View source’ in your browser to get the source.

#include <stdio.h>
#include <string.h>
#include <time.h>
 
int main (int argc, const char * argv[]) {
 
# ifdef _DEBUG
  // Print args 0 - command, 1 - 3 letter day
  int i = 0;
  for( i=0 ; i<argc ; ++i ) {
    printf( "arg( %d ) = %s\n", i, argv[i] );
  }
# endif
 
  // Usage
 
  // Too few args
  if( argc < 2 ) {
    printf( "Error: Too few arguments.\nUsage: datep mon|tue|wed|...|sun [\"+format\"]\nSee date for description of format." );
    return -1;
  }
  
  // Check that we got at least 3 chars for day compare
  if( 3 != strlen( argv[1] ) ) {
    printf( "Please specify a valid day.\nUsage: datep mon|tue|wed|...|sun [\"+format\"]\nSee date for description of format.\n" );
    return -1;
  }
 
  // Check a valid day was passed
  int valid = 0;
  if( !strncasecmp( "sun", argv[1], 3 ) ) valid = 1;
  if( !strncasecmp( "mon", argv[1], 3 ) ) valid = 1;
  if( !strncasecmp( "tue", argv[1], 3 ) ) valid = 1;
  if( !strncasecmp( "wed", argv[1], 3 ) ) valid = 1;
  if( !strncasecmp( "thu", argv[1], 3 ) ) valid = 1;
  if( !strncasecmp( "fri", argv[1], 3 ) ) valid = 1;
  if( !strncasecmp( "sat", argv[1], 3 ) ) valid = 1;
 
  // If not valid ...
  if( !valid ) {
    printf( "Please specify a valid day.\nUsage: datep mon|tue|wed|...|sun [\"+format\"]\nSee date for description of format.\n" );
    return -1;
  }
 
  // Get todays date
  time_t cur_time = time(NULL);
  struct tm *loc_time;
  char buffer[255];
  strncpy( buffer, "xxx", 4 );
 
  // ### always skip back by at least one day
  // Skip back by at least 1 day until we find the day the user specified
  while( strncasecmp( argv[1], buffer, 3 )!=0 ) {
    // skip back a day
    cur_time = cur_time - 1*24*60*60;  // one days worth of seconds
 
    // Format TLA for day into buffer
    loc_time = localtime( &cur_time );
    strftime( buffer, 4, "%a", loc_time );
  }
 
  // Print day in standard [20061017] or passed format
  // ### implement using passed format
  strftime( buffer, 255, "%Y%m%d", loc_time );
  printf( "%s", buffer );
  
  return 0;
}