How to store a date in 4 bytes?
"My Karma ran over your dogma." - Unknown
This was an interesting little C# newsgroup nugget. User has a registration code with 4 unused bytes, and wants to know how to store a date in same. (Actually I believe the user was thinking of 4 extra characters in a string - not "bytes", but the exercise is still a good one).
Suggestions were made to store an integer representing the number of days from a fixed date. That would certainly do it, but it doesn't convey any context.
Here's my take:
using System;
using System.Collections.Generic;
using System.Text;
namespace _bytedate
{
class Program
{
static void Main(string[] args)
{
// this makes sorting by date on an integer value perfect,
// e.g. year+month+day, padded to make an integer
int myDate = 20071105;
byte[] b = BitConverter.GetBytes(myDate);
Console.WriteLine(b.Length.ToString() + " bytes.");
// reads "4 bytes"
// And -back again:
Console.WriteLine("Original: " +BitConverter.ToInt32(b, 0).ToString());
Console.ReadKey();
}
}
}
BitConverter has methods that can do all kinds of cool stuff like this -- both forwards, and back.
You could also write simple "conversion methods":
private static DateTime Int32ToDateTime(int myInt)
{
string s = myInt.ToString();
string yr = s.Substring(0, 4);
string mo = s.Substring(4, 2);
string dy = s.Substring(6, 2);
string theDate = string.Concat(yr, "/", mo, "/", dy);
return DateTime.Parse(theDate);
}
private static int DateTimeToInt32( DateTime dt)
{
string yr = dt.Year.ToString();
string mo = dt.Month.ToString();
if (mo.Length == 1) mo = "0" + mo;
string dy = dt.Day.ToString();
if (dy.Length == 1) dy = "0" + dy;
int myDate = int.Parse(yr + mo + dy);
return myDate;
}
Readers will of course observe that the Time component of the DateTime object needs to be conveniently left out of this exercise. Note that if a month or day component of the datetime is the equivalent of a one-character item, I prepend a zero ( 0) character into the resultant string to maintain sort capability on integer values.
Hi - sorry for nitpicking, but...
ReplyDeletestring yr = dt.Year.ToString();
string mo = dt.Month.ToString();
if (mo.Length == 1) mo = "0" + mo;
string dy = dt.Day.ToString();
if (dy.Length == 1) dy = "0" + dy;
int myDate = int.Parse(yr + mo + dy);
return myDate;
Could be replaced with:
string strDate = String.Format("{0:0000}{1:00}{2:00}", dt.Year, dt.Month, dt.Day);
return Convert.ToInt32(strDate);
Again, sorry - couldn't resist :-)
Nice. No need to apologize.
ReplyDelete