AnonymousNamefag

date.c

Dec 8th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.87 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. /*
  7.  * Format characters:
  8.  * %y: 2-digit year
  9.  * %Y: 4-digit year
  10.  * %M: Month name
  11.  * %N: Month number
  12.  * %D: Day of month
  13.  * %d: Day of week name
  14.  * %H: Hour in 24-hour mode
  15.  * %h: Hour in 12-hour mode
  16.  * %m: Minute
  17.  * %s: Second
  18.  * %P: AM or PM label
  19.  * %Z: String representing time zone
  20.  * %n: Newline
  21.  * %%: % symbol
  22.  */
  23.  
  24. char *format_string = "%d %M %D, %Y %H:%m:%s %Z";
  25. char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
  26. char *dow[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
  27.  
  28. void usage( void );
  29.  
  30. int main( int argc, char **argv ){
  31.     time_t timestamp = time( NULL );
  32.     struct tm *curtime = localtime( &timestamp );
  33.     if( argv[1] ){
  34.         if( argv[1][0] == '-' ){
  35.             usage();
  36.             exit( 0 );
  37.         }
  38.         format_string = argv[1];
  39.     }
  40.     int len = strlen( format_string );
  41.     /* Scan format string: */
  42.     for( int i = 0; i < len; i++ ){
  43.         if( format_string[i] == '%' ){
  44.             i++;
  45.             switch( format_string[i] ){
  46.                 case 'Y' : printf( "%d", curtime->tm_year + 1900 ); break;
  47.                 case 'y' : printf( "%s%d", (curtime->tm_year % 100 < 10)?"0":"", curtime->tm_year % 100); break;
  48.                 case 'N' : printf( "%s%d", (curtime->tm_mon < 9)?"0":"", curtime->tm_mon + 1 ); break;
  49.                 case 'M' : printf( "%s", months[curtime->tm_mon] ); break;
  50.                 case 'D' : printf( "%s%d", (curtime->tm_mday < 10)?"0":"", curtime->tm_mday ); break;
  51.                 case 'd' : printf( "%s", dow[curtime->tm_wday] ); break;
  52.                 case 'H' : printf( "%s%d", (curtime->tm_hour < 10)?"0":"", curtime->tm_hour ); break;
  53.                 case 'h' : printf( "%2d", (curtime->tm_hour % 12)?(curtime->tm_hour % 12):12 ); break;
  54.                 case 'm' : printf( "%s%d", (curtime->tm_min < 10)?"0":"", curtime->tm_min ); break;
  55.                 case 's' : printf( "%s%d", (curtime->tm_sec < 10)?"0":"", curtime->tm_sec ); break;
  56.                 case 'P' : printf( "%cM", (curtime->tm_hour < 12)?'A':'P' ); break;
  57.                 case 'Z' : printf( "%s", curtime->__TM_ZONE ); break;
  58.                 case 'n' : putchar( '\n' ); break;
  59.                 default  : putchar( format_string[i] );
  60.             }
  61.         }
  62.         else putchar( format_string[i] );
  63.     }
  64.     putchar( '\n' );
  65.     return 0;
  66. }
  67.  
  68. void usage(){
  69.     putchar( '\n' );
  70.     puts( "Usage: date [format_string]" );
  71.     putchar( '\n' );
  72.     puts( "Metacharacters for format string:" );
  73.     puts( "\t\%y: 2-digit year" );
  74.     puts( "\t\%Y: 4-digit year" );
  75.     puts( "\t\%M: Month name" );
  76.     puts( "\t\%N: Month number" );
  77.     puts( "\t\%D: Day of month" );
  78.     puts( "\t\%d: Day of week name" );
  79.     puts( "\t\%H: Hour in 24-hour mode" );
  80.     puts( "\t\%h: Hour in 12-hour mode" );
  81.     puts( "\t\%m: Minute" );
  82.     puts( "\t\%s: Second" );
  83.     puts( "\t\%P: AM or PM label" );
  84.     puts( "\t\%Z: String representing time zone" );
  85.     puts( "\t\%n: Newline" );
  86.     puts( "\t\%\%: \% symbol" );
  87.     putchar( '\n' );
  88.     puts( "Default format string:" );
  89.     printf( "\"%s\"\n\n", format_string );
  90. }
Add Comment
Please, Sign In to add comment