Converti DateTime in numero di versione più breve possibile (per URL)
-
29-10-2019 - |
Domanda
Sfida: convertire una "data modificata" DateTime
di un file di immagine a un numero / stringa di versione adatto per mantenere unicità in un URL, quindi ogni modifica dell'immagine genera un URL univoco, il numero di versione / stringa è il più breve possibile.
La mancanza di codice è secondaria alla mancanza di scuse numero/stringa se ciò non si qualifica per lo stato del codice-golf :-)
Requisiti
- C#, .NET Framework V4
- L'output deve essere caratteri validi per un nome di cartella in un URL.
- La precisione datetime può essere ridotta al minuto più vicino.
EDIT: questo non è del tutto teorico / puzzle, quindi immagino che preferirei tenerlo qui che sullo scambio di stack di code-golf?
Soluzione
Utilizzare il DateTime.Ticks
Proprietà e quindi convertirlo in un numero di base 36. Sarà molto breve e utilizzabile su un URL.
Ecco una lezione per convertire in/dalla base 36:
http://www.codeproject.com/kb/cs/base36.aspx
Puoi anche usare la base 62, ma non la base64 poiché una delle cifre extra nella base 64 oltre i numeri e le lettere è +
che deve essere codificato URL e hai detto che volevi evitarlo.
Altri suggerimenti
Ok, combinando risposte e commenti ho escogitato quanto segue.
Nota: rimozione di byte di imbottitura zero e differenza di data di inizio dall'inizio del progetto per ridurre la dimensione dei numeri.
public static string GetVersion(DateTime dateTime)
{
System.TimeSpan timeDifference = dateTime - new DateTime(2010, 1, 1, 0, 0, 0, DateTimeKind.Utc);
long min = System.Convert.ToInt64(timeDifference.TotalMinutes);
return EncodeTo64Url(min);
}
public static string EncodeTo64Url(long toEncode)
{
string returnValue = EncodeTo64(toEncode);
// returnValue is base64 = may contain a-z, A-Z, 0-9, +, /, and =.
// the = at the end is just a filler, can remove
// then convert the + and / to "base64url" equivalent
//
returnValue = returnValue.TrimEnd(new char[] { '=' });
returnValue = returnValue.Replace("+", "-");
returnValue = returnValue.Replace("/", "_");
return returnValue;
}
public static string EncodeTo64(long toEncode)
{
byte[] toEncodeAsBytes = System.BitConverter.GetBytes(toEncode);
if (BitConverter.IsLittleEndian)
Array.Reverse(toEncodeAsBytes);
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes.SkipWhile(b=>b==0).ToArray());
return returnValue;
}