Cela fait un moment que je me débat avec ce morceau de code pour une application Android et je n'arrive pas à comprendre. J'ai lu et essayé toutes les solutions trouvées sur stackoverflow et d'autres endroits, mais toujours pas de chance.
Ce que je veux faire, c'est avoir une fonction pour convertir une chaîne comme "17.08.2012 05:35:19:7600000"
En une date UTC et une fonction qui prend un UTC date
Et le convertit en une chaîne comme ça.
String value = "17.08.2012 05:35:19:7600000";
DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS");
try
{
Date today = df.parse(value);
System.out.println("Today = " + df.format(today) + " " + today.toGMTString());
}
catch (ParseException e)
{
e.printStackTrace();
}
Cela entraîne: Today = 17.08.2012 07:41:59:0000000 17 Aug 2012 04:41:59 GMT
Qui sont tous les deux faux.
J'ai essayé de régler SDF's timezone
Sur UTC
, pas de chance.
Autre chose que j'ai remarquée: si je fais df.setLenient(false);
Cela me donne: Java.text.ParseException: Unparseable date: "17.08.2012 05:35:19:7600000"
.
Si quelqu'un peut me fournir des explications/un exemple de code, je serais très reconnaissant. Merci d'avance
Le résultat que vous obtenez est absolument correct.
Analysons ceci:
17.08.2012 05:35:19:7600000
Maintenant, la façon dont VM voit cela, c'est que vous déclarez l'heure de la journée comme 5:35:19 du matin, puis ajoutez 7600000 millisecondes. 7600000 millisecondes = 7600 secondes = 2 heures, 6 minutes, 40 secondes. 5:35:19 am + 02:06:40 = 7:41:59 am (et 0 milliseconde). Voici le résultat que vous obtenez. (Il semble également que vous ne définissez pas correctement le fuseau horaire, donc la chaîne GMT a 3 heures de retard sur votre résultat.)
Si vous souhaitez conserver le :7600000
, à ma connaissance ce n'est pas possible. Comme cela peut être simplifié en secondes, le VM le réduira automatiquement dans les autres incréments de temps. Les millisecondes (le SSSS
) doivent être pour stocker des valeurs <1000.
Je vous suggère de créer un nouveau SimpleDateFormat
pour votre sortie; mais rappelez-vous que les millisecondes seront absorbées dans les autres temps (puisqu'elles sont toutes stockées comme un seul long
dans l'objet Date
).
private String convertDate(String cdate)
{
SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS");
SimpleDateFormat postFormater = new SimpleDateFormat("yyyy-MM-dd");
Date convertedDate;
try
{
convertedDate = dateFormat.parse(cdate);
cdate = postFormater.format(convertedDate);
}
catch (ParseException e)
{
Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_SHORT).show();
}
return cdate;
}
Essaye ça.
Voici ce dont vous avez besoin (mais cela perdra des informations en millisecondes):
"dd.MM.yyyy HH:mm:ss.'000000'"
Si vous avez utilisé "dd.MM.yyyy HH:mm:ss.SSSSSS"
, alors obtiendrait trois zéros non significatifs pour vos millisecondes.
Si vous avez utilisé "dd.MM.yyyy HH:mm:ss.SSS'000'"
, vous pouvez alors formater une date, mais ne pas analyser de date.
Essaye le:
public static void main(String[] args) throws ParseException {
printDate("dd.MM.yyyy HH:mm:ss.SSS");//02.05.2010 21:45:58.073
printDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//02.05.2010 21:45:58.000073
printDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//02.05.2010 21:45:58.073000
printDate("dd.MM.yyyy HH:mm:ss.'000000'");//02.05.2010 21:45:58.000000
tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS");//good
tryToParseDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//good
tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//bad
tryToParseDate("dd.MM.yyyy HH:mm:ss.'000000'");//good
}
private static void printDate(String formatString) {
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat(formatString);
String formattedDate = format.format(now);
// print that date
System.out.println(formattedDate);
}
private static void tryToParseDate(String formatString) {
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat(formatString);
String formattedDate = format.format(now);
// try to parse it again
try {
format.parse(formattedDate);
System.out.println("good");
} catch (ParseException e) {
System.out.println("bad");
}
}
Pour supprimer les nanosecondes, utilisez:
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.")