Military type format date/time conversion


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Military type format date/time conversion
# 1  
Old 11-08-2011
Military type format date/time conversion

Hello All,

I have a requirement to convert a 12 hour format to 24 hour time format and the sample input /out put is below

Input Time format : Nov 2 2011 12:16AM
Out Put Format : Nov 2 2011 0:16

Input : Nov 2 2011 4:16PM
Out Put: Nov 2 2011 16:16

I have done this using a perl script and working absolutely fine -
###############
Code:
use strict;

while( my $line = <DATA> ){
 $line =~ s/(\d+)(:\d+)(A|P)\.M\,/($3 eq 'a')?($1%12).$2:($1%12+12).$2/e;
 print $line;
}

__DATA__
Nov 2 2011 12:41A.M,
Nov 2 2011 12:41A.M,
Nov 2 2011  3:41P.M,
Nov 2 2011  5:41P.M,

###################OUT PUT#############

Nov 2 2011 12:41
Nov 2 2011 12:41
Nov 2 2011 15:41
Nov 2 2011 17:41


My requirement is now :
1) I have file with thousands of records like below and i want to convert each of the records with right time format as i mentioned above.

Nov 2 2011 12:01AM,52893,420,1,4,0,52834,4,1208,67664942,603459924403.0,1,150054,1208,3
Nov 2 2011 5:16PM,52127,420,1,4,0,52122,4,1429,55943831,603459924406.0,1,150054,1429,3

I need to convert the first column match (12:01AM/5:16PM) and convert this to right format

Expected output is :

Nov 2 2011 0:01,52893,420,1,4,0,52834,4,1208,67664942,603459924403.0,1,150054,1208,3
Nov 2 2011 17:16,52127,420,1,4,0,52122,4,1429,55943831,603459924406.0,1,150054,1429,3

I know with little modification to my script this can be acheived but i am not able to match the entire record with regx.

ANY HELP IS MUCH APPRICIATED.
# 2  
Old 11-08-2011
Here is one way:
Code:
sed 's/.* \(.*[AP]M\).*/\1/' File

# 3  
Old 11-08-2011
you hardly need to match the entire line, especially when the data comes in a convenient tabular format. awk is made for this.

Code:
$ cat 24hr.awk

BEGIN { FS=","; OFS="," }
{
        split($1, A, " ");        split(A[4], B, ":");

        HR=B[1];
        MIN=substr(B[2], 0, 2);
        AM=substr(B[2], 3);

        if(AM == "PM")  HR += 12;

        $1=sprintf("%s %s %s %02d:%02d", A[1], A[2], A[3], HR, MIN);
} 1

$ awk -f 24hr.awk < data

Nov 2 2011 12:01,52893,420,1,4,0,52834,4,1208,67664942,603459924403.0,1,150054,1208,3
Nov 2 2011 17:16,52127,420,1,4,0,52122,4,1429,55943831,603459924406.0,1,150054,1429,3

$

# 4  
Old 11-08-2011
Thanks but i need the entire records - not the date/time part and also your out put has AM/PM which is not needed .

Ex. Input records :
Nov 2 2011 12:01AM,52893,420,1,4,0,52834,4,1208,67664942,603459924403.0,1,150054,1208,3
Nov 2 2011 5:05PM,52127,420,1,4,0,52122,4,1283,151823875,603459924404.0,1,150054,1283,3

Expected out put records:

Nov 2 2011 12:01,52893,420,1,4,0,52834,4,1208,67664942,603459924403.0,1,150054,1208,3
Nov 2 2011 17:05,52127,420,1,4,0,52122,4,1283,151823875,603459924404.0,1,150054,1283,3


If my perl script can be modified to match the records or same sed command equivalent than it will be fine.
# 5  
Old 11-08-2011
A correction for the 12:... to 0:... fix:

Code:
$ cat 24hr.awk

BEGIN { FS=","; OFS="," }

{      # Split "Nov 2 2011 12:01AM" into A[1]="Nov", A[2]="2", A[3]="2011", A[4]="12:01AM"
        split($1, A, " ");
        # Split "12:01AM" into B[1]="12", B[2]="01AM"
        split(A[4], B, ":");

        HR=B[1];
        MIN=substr(B[2], 0, 2); # Get "01" out of "01AM"
        AM=substr(B[2], 3); # Get "AM" out of "01AM"

        HR %= 12;
        if(AM == "PM")  HR+=12;
        # Put the data we want back into first field the way we want it.
        $1=sprintf("%s %s %s %d:%02d", A[1], A[2], A[3], HR, MIN);
} 1 # Always print the entire line.

$ awk -f 24hr.awk < data
Nov 2 2011 0:01,52893,420,1,4,0,52834,4,1208,67664942,603459924403.0,1,150054,1208,3
Nov 2 2011 17:16,52127,420,1,4,0,52122,4,1429,55943831,603459924406.0,1,150054,1429,3

$

# 6  
Old 11-08-2011
Excellent @Corona Thanks much for your time
# 7  
Old 11-08-2011
What you already have works, you just need to tweak your regex:

Code:
#!/usr/bin/env perl

use strict;

my $line;

while($line = <DATA>) {
    $line =~ s/(\d+)(:\d+)(A|P)M\,/($3 eq 'a')?($1%12).$2:($1%12+12).$2/e;
    chomp($line);
    print "$line\n";
}

exit(0);

__DATA__
Nov 2 2011 12:01AM,52893,420,1,4,0,52834,4,1208,67664942,603459924403.0,1,150054,1208,3
Nov 2 2011 5:16PM,52127,420,1,4,0,52122,4,1429,55943831,603459924406.0,1,150054,1429,3

Output:

Nov 2 2011 12:0152893,420,1,4,0,52834,4,1208,67664942,603459924403.0,1,150054,1208,3
Nov 2 2011 17:1652127,420,1,4,0,52122,4,1429,55943831,603459924406.0,1,150054,1429,3

Basically removing the '.' before the 'M' from you regex will do it.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Date format conversion how to change this from using nawk to awk

Hi, I have a file where I need to change the date format on the nth field from DD-MM-YYYY to YYYY-MM-DD so I can accurately sort the record by dates From regex - Use sed or awk to fix date format - Stack Overflow, I found an example using nawk. Test run as below: $: cat xyz.txt A ... (2 Replies)
Discussion started by: newbie_01
2 Replies

2. Shell Programming and Scripting

Bash Scripting with date format conversion

I have a script below and wanted to change the output into three different file format (3 separate script) #!bin/bash #input file format postwrf_d01_20131206_0600_f08400.grb2 #postwrf_d01_YYYYMMDD_ZZZZ_f0HHHH.grb2 #zzzz= 0000,0600,1200,1800 (in UTC) #HHHH=00000,00600,01200,01800 ..ect (in... (1 Reply)
Discussion started by: cumulus_255
1 Replies

3. Shell Programming and Scripting

Date format conversion

Hi, i have to check the file whether it is created today. here is the ls -l o/p -rw-r----- 20000 50000 130 Dec 12 10:21 file.txt im able to check if file is created today or not if the timestamp is in 2014-12-12 format by comparing $(date +Y-%m-%d) but stuckup as it is of format Dec 12... (6 Replies)
Discussion started by: JSKOBS
6 Replies

4. Shell Programming and Scripting

Date conversion and Format

Hello , I have a record in below format Hostname | Query: 0 | Release: 0 | files: 2 | Files_examined: 2 | SET timestamp=1396778638; | select * from test I need output in below format Hostname | 0 | 0 | 2 | 2 | 04/06/2014|03:03:58 | select * from test I was able to get above output... (1 Reply)
Discussion started by: Tomlight
1 Replies

5. Shell Programming and Scripting

Date conversion from 24 hr format to 12 hr format

hi i want to convert date procured from sone operation which will be in 24hr format to 12 hr format displaying AM and PM # date -d @1362545068 Tue Mar 5 23:44:28 EST 2013 # this Tue Mar 5 23:44:28 EST 2013 i want to convert it so that output is as below Tue... (2 Replies)
Discussion started by: vivek d r
2 Replies

6. Shell Programming and Scripting

Date format conversion

Hi All, Can someone please let me know how can i convert the date format in unix as follow: From: 24 Oct 2011 i.e $(date +'%d %b %Y') To: 111024 i.e $(date +%y%m%d) Thanks in advance (3 Replies)
Discussion started by: davidtd
3 Replies

7. UNIX for Dummies Questions & Answers

date format conversion

hi, i have a file in which i get date format as 22/APR/2010... now i want the date format to be in 22-04-2010 if the month changes to may the file should also have 05 as month.... pls help (3 Replies)
Discussion started by: siva_nagarajan
3 Replies

8. Shell Programming and Scripting

Convert Epoch time format to normal date time format in the same file

I have a file named "suspected" with series of line like these : {'protocol': 17, 'service': 'BitTorrent KRPC', 'server': '219.78.120.166', 'client_port': 52044, 'client': '10.64.68.44', 'server_port': 8291, 'time': 1226506312L, 'serverhostname': ''} {'protocol': 17, 'service': 'BitTorrent... (3 Replies)
Discussion started by: rk4k
3 Replies

9. Windows & DOS: Issues & Discussions

conversion of unix time format

help me to convert unix time format into windows time format using java i have linux time ex. 1075329297.572 (2 Replies)
Discussion started by: sari
2 Replies

10. UNIX for Dummies Questions & Answers

Date format conversion function

Hello, does somebody knows about a function that would convert a date like: YYMMDD into a date like YYYY-MM-DD ? Thank you for your ideas :) (9 Replies)
Discussion started by: Cecile
9 Replies
Login or Register to Ask a Question