Comment formater Joda-Time DateTime en mm / jj / aaaa?

189

J'ai une chaîne " 11/15/2013 08:00:00", je veux la formater en " 11/15/2013", quel est le DateTimeFormattermodèle correct ?

J'ai essayé beaucoup et googlé et toujours incapable de trouver le bon modèle.

edit: Je recherche Joda-Time DateTimeFormatter , pas SimpleDateFormat de Java.

iCodeLikeImDrunk
la source
2
tl; dr: DateTimeFormat.forPattern ("MM / jj / aaaa HH: mm: ss"). print (DateTime.now ())
Andrew

Réponses:

386

Heure Joda

Créer une DateTimeFormatterutilisationDateTimeFormat.forPattern(String)

En utilisant Joda time, vous le feriez comme ceci:

String dateTime = "11/15/2013 08:00:00";
// Format for input
DateTimeFormatter dtf = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss");
// Parsing the date
DateTime jodatime = dtf.parseDateTime(dateTime);
// Format for output
DateTimeFormatter dtfOut = DateTimeFormat.forPattern("MM/dd/yyyy");
// Printing the date
System.out.println(dtfOut.print(jodatime));

Java standard ≥ 8

Java 8 a introduit une nouvelle bibliothèque de date et d'heure , facilitant la gestion des dates et des heures. Si vous souhaitez utiliser la version standard de Java 8 ou une version ultérieure, vous utiliserez un DateTimeFormatter . Comme vous n'avez pas de fuseau horaire dans votre String, un java.time.LocalDateTime ou un LocalDate , sinon les variétés zonées de temps ZonedDateTime et ZonedDate pourraient être utilisées.

// Format for input
DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
// Parsing the date
LocalDate date = LocalDate.parse(dateTime, inputFormat);
// Format for output
DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy");
// Printing the date
System.out.println(date.format(outputFormat));

Java standard <8

Avant Java 8, vous utilisiez un SimpleDateFormat et java.util.Date

String dateTime = "11/15/2013 08:00:00";
// Format for input
SimpleDateFormat dateParser = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
// Parsing the date
Date date7 = dateParser.parse(dateTime);
// Format for output
SimpleDateFormat dateFormatter = new SimpleDateFormat("MM/dd/yyyy");
// Printing the date
System.out.println(dateFormatter.format(date7));
DeltaLima
la source
7
désolé, mais je cherche le DateTimeFormatter de jodatime.
iCodeLikeImDrunk
1
@yaojiang Joda utilise la même syntaxe de chaîne de format que SimpleDateFormat. Lisez la documentation de l'API.
Jesper
@yaojiang Comme Jesper l'a mentionné, Joda utilise les mêmes chaînes de formatage, bien qu'il ait plus d'options. J'ai étendu l'exemple pour inclure Joda, comme vous pouvez le voir, c'est très similaire.
DeltaLima
étrangement j'utilise DateTimeFormatter dtf = DateTimeFormat.forPattern ("MM / jj / aaaa"); et j'obtiens toujours "mm / jj / aaaa hh: mm: ss" ...
iCodeLikeImDrunk
2
Bien que Joda-Time utilise des codes de formatage très similaires à java.util.Date/Calendar, lisez attentivement la documentation pour les différences subtiles. Ils ne sont pas identiques.
Basil Bourque
45

J'ajoute ceci ici même si les autres réponses sont tout à fait acceptables. JodaTime a des analyseurs pré-intégrés dans DateTimeFormat:

dateTime.toString(DateTimeFormat.longDate());

Voici la plupart des options imprimées avec leur format:

shortDate:         11/3/16
shortDateTime:     11/3/16 4:25 AM
mediumDate:        Nov 3, 2016
mediumDateTime:    Nov 3, 2016 4:25:35 AM
longDate:          November 3, 2016
longDateTime:      November 3, 2016 4:25:35 AM MDT
fullDate:          Thursday, November 3, 2016
fullDateTime:      Thursday, November 3, 2016 4:25:35 AM Mountain Daylight Time
Chad Bingham
la source
1
sympa, une idée de la version introduite? gagner beaucoup de temps en ne créant pas de chaînes de format stupides ...
iCodeLikeImDrunk
Ouais je suis totalement d'accord. On dirait que ça a toujours été là. joda-time.sourceforge.net/apidocs/org/joda/time/format/…
Chad Bingham
21
DateTime date = DateTime.now().withTimeAtStartOfDay();
date.toString("HH:mm:ss")
sebastian krüger
la source
1
Ceci est utile, mais ne répond pas exactement à la question. Version une ligne:DateTime.now().toString("HH:mm:ss")
hBrent
11

Je pense que cela fonctionnera, si vous utilisez JodaTime:

String strDateTime = "11/15/2013 08:00:00";
DateTime dateTime = DateTime.parse(strDateTime);
DateTimeFormatter fmt = DateTimeFormat.forPattern("MM/dd/YYYY");
String strDateOnly = fmt.print(dateTime);

J'en ai une partie d' ici .

Le gars avec le chapeau
la source
Votre lien vers la documentation est obsolète. L'URL correcte est: joda.org/joda-time/apidocs/org/joda/time/format/…
Basil Bourque
1
@BasilBourque Merci de préciser que Dc'est pour jour de l'année, mais mon "lien vers la documentation" n'est pas périmé: la documentation à laquelle j'ai lié est périmée. Je ne faisais pas de lien vers la documentation dans son propre intérêt, je faisais un lien vers la page dont j'ai obtenu du code - qui se trouve être une documentation obsolète.
Le gars au chapeau
10

J'ai une option très stupide mais qui fonctionne. si vous avez la chaîne fullDate = "11/15/2013 08:00:00";

   String finalDate = fullDate.split(" ")[0];

Cela devrait fonctionner facilement et rapidement. :)

Vêtu vêtu
la source
oui, je vais certainement changer le format. cela fonctionne mais uniquement pour ce cas.
iCodeLikeImDrunk
1
Comportement pas vraiment attendu, après personne (y compris vous) qui regarde votre code ne comprend rien ce que vous avez fait ici ...
Sercan Ozdemir
3

ACTUALISÉ:

Vous pouvez: créer une constante:

private static final DateTimeFormatter DATE_FORMATTER_YYYY_MM_DD =
          DateTimeFormat.forPattern("yyyy-MM-dd"); // or whatever pattern that you need.

Ce DateTimeFormat importe depuis: (soyez prudent avec cela)

import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter;

Analyser la date avec:

DateTime.parse(dateTimeScheduled.toString(), DATE_FORMATTER_YYYY_MM_DD);

Avant:
DateTime.parse ("201711201515", DateTimeFormat.forPattern ("aaaaMMjjHHmm")). ToString ("aaaaMMjj");

si vous voulez datetime:

DateTime.parse("201711201515", DateTimeFormat.forPattern("yyyyMMddHHmm")).withTimeAtStartOfDay();
Jacky.cheng
la source
2

Cela marche

String x = "22/06/2012";
String y = "25/10/2014";

String datestart = x;
String datestop = y;

//DateTimeFormatter format = DateTimeFormat.forPattern("dd/mm/yyyy");
SimpleDateFormat  format = new SimpleDateFormat("dd/mm/yyyy");

Date d1 = null;
Date d2 = null;

try {
    d1 =  format.parse(datestart);
    d2 = format.parse(datestop);

    DateTime dt1 = new DateTime(d1);
    DateTime dt2 = new DateTime(d2);

    //Period
    period = new Period (dt1,dt2);

    //calculate days
    int days = Days.daysBetween(dt1, dt2).getDays();


} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
Eddie
la source
1

Une autre façon de faire est:

String date = dateAndTime.substring(0, dateAndTime.indexOf(" "));

Je ne suis pas tout à fait certain, mais je pense que cela pourrait être plus rapide / utiliser moins de mémoire que d'utiliser la .split()méthode.

Le gars avec le chapeau
la source