web-dev-qa-db-fra.com

Conversion chaîne-date en nanosecondes

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

15
Rhadoozooz

Le résultat que vous obtenez est absolument correct.

Analysons ceci:

17.08.2012 05:35:19:7600000
  • 17: Jour du mois (17)
  • 08: Mois de l'année (août)
  • 2012: Année (2012)
  • 05: Heure de la journée (5h)
  • 35: Minute d'heure (: 35)
  • 19: Seconde de minute (: 19)
  • 7600000: Millisecondes de seconde (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).

22
Eric
    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.

6
Rajesh Rajaram

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");
    }
}
3
slartidan

Pour supprimer les nanosecondes, utilisez:

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.")
0
Henry