Возможно, вариант времени unix (секунд с 01.01.1970, а не миллисекунд) в кодировке base64.
//Helpers
private static DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static long toUnixTime(this DateTime d)
{
return (long)((d.ToUniversalTime() - Jan1st1970).TotalMilliseconds);
}
public static string Base64Encode(long toEncode)
{
return Convert.ToBase64String(BitConverter.GetBytes(toEncode));
}
//Encode
public static string PackDate(DateTime toPack)
{
return Base64Encode(toPack.toUnixTime()/1000);
}
//Decode
public static DateTime UnpackDate(string toUnpack)
{
long time = BitConverter.ToInt64(Convert.FromBase64String(toUnpack),0);
return Jan1st1970.AddSeconds(time); //you may or may not want a "ToLocaltime()" call here.
}
Обратите внимание, что все это было сделано без помощи IDE - вероятно, есть ошибкаили два выше.Но это должно помочь вам начать.
Это должно привести к строке фиксированной ширины.Поскольку мы выполняем только секунды, а не миллисекунды, вы можете обнаружить, что у вас всегда есть дополнительные отступы в результате, которые вам не нужны.Возможно, вам даже удастся использовать int, а не long, который разрезает строку пополам.Будьте осторожны, убирая это отступление, но чем ближе к 1970 году, тем меньше число, но чем дальше, тем больше оно и тем больше вероятность того, что оно вам понадобится.Вы должны быть уверенными , что ваше значение даты будет соответствовать новому, меньшему диапазону для выполнения любой обрезки.Например, текущая дата удобно помещается в пределах int, но даже через 28 лет не будет.UInt32 продвинет вас в будущее, но не позволит использовать даты до 1970 года.