package dk.dr.radio.data;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import dk.dr.radio.diverse.App;
import dk.dr.radio.diverse.Log;
/**
* Klasse til at håndtere, at udviklerne af backenden ikke kan (eller vil) garantere et ensartet
* datoformat, og heller ikke kan/vil dokumentere de mulige datoformater eller sende eksempler på dem:
* "Jeg har ikke noget overblik hvor mange forskellige formateringer der er, da det er .NET der styrer dette."
*
* Det eneste der vides er, at er tidsformatet overholder ISO-8601, men derudover kan det variere vilkårligt
* inden for de hundredevis af formater som standarden tillader. Disse omfatter:
* 20090106
* 2009-01-06
* 2004-05
* 2009-W53-7
* 2009-W01-1
* 2007-04-05T14:30
* 2007-04-05T14:30Z
* 2008-05-11T15:30:00Z
* 2007-04-05T12:30-02:00
* Date: 2014-12-15
* Combined date and time in UTC: 2014-12-15T05:48:43+00:00
* 2014-12-15T05:48:43Z
* Week: 2014-W51
* Date with week number: 2014-W51-1
* Ordinal date: 2014-349
*
* Se andre på https://en.wikipedia.org/wiki/ISO_8601
*
*@author Jacob Nordfalk pr 15/12/2014.
*/
public class DRBackendTidsformater {
private static final Date juleaften = new Date(104, 11, 24, 20, 00); // 24/12 2014 kl 20:00
/**
* Det tidformat, DRs backend normalt sender: "2014-02-13T10:03:00+01:00"
*/
public static DateFormat servertidsformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz", Locale.US);
/**
* Nogle gange kommer "2014-11-07T14:00:39.871+01:00" !#"!%#!! F.eks.:
* http://www.dr.dk/tjenester/mu-apps/series/disse-oejeblikke?type=radio&includePrograms=true&offset=0
*/
public static DateFormat[] servertidsformatAndre = new SimpleDateFormat[]{
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz", Locale.US),
};
/**
* Det tidformat, DRs backend normalt sender for playlister når vi rammer ny Azure-backend: "2014-02-13T10:03:00+0000"
*/
public static DateFormat servertidsformatPlayliste = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz", Locale.US);
/**
* Nogle gange kommer et andet tidsformat, når vi rammer gammel backend: "2014-02-13T10:03:00"
*/
public static DateFormat[] servertidsformatPlaylisteAndre2 = new DateFormat[]{
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US),
};
private static Date parseUpålideigtServertidsformat(String tid, DateFormat tidsformat, DateFormat[] tidsformatAndre) {
try {
Date res = tidsformat.parse(tid);
return res;
} catch (Exception e) {
Log.d("Kunne ikke ikke parse "+tid+" med "+tidsformat.format(juleaften)+" "+e+" (prøver med et andet)");
for (DateFormat tidsformatAndet : tidsformatAndre) {
try {
return tidsformatAndet.parse(tid);
} catch (Exception ex) { Log.d("Kunne ikke heller ikke parse "+tid+" med "+tidsformat.format(juleaften)+" "+ex); }
}
Log.rapporterFejl(new IllegalArgumentException("åh nej, der kom endnu et servertidsformat, vi ikke kender! "+tid));
if (App.EMULATOR) throw new Error(); // Stop med et crash i emulatoren
// Giv juleaften, bare for at gøre *etellerandet* !! :-(
return juleaften;
}
}
public static Date parseUpålideigtServertidsformat(String tid) {
return parseUpålideigtServertidsformat(tid, servertidsformat, servertidsformatAndre);
}
public static Date parseUpålideigtServertidsformatPlayliste(String tid) {
return parseUpålideigtServertidsformat(tid, servertidsformatPlayliste, servertidsformatPlaylisteAndre2);
}
public static void main(String[] a) throws Exception {
// DRBackendTidsformater.servertidsformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US); // +01:00 springes over da kolon i +01:00 er ikke-standard Java
// parseUpålideigtServertidsformat("2014-02-13T10:03:00+01:00");
DRBackendTidsformater.servertidsformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz", Locale.US); // +01:00 springes over da kolon i +01:00 er ikke-standard Java
Date res = parseUpålideigtServertidsformat("2016-04-01T08:03:00+0000");
System.out.println("res = "+res);
}
}