web-dev-qa-db-fra.com

Supprimer le temps d'un objet Date?

Je souhaite supprimer l'heure de l'objet Date.

DateFormat df;
String date;
df = new SimpleDateFormat("dd/MM/yyyy");
d = eventList.get(0).getStartDate(); // I'm getting the date using this method
date = df.format(d); // Converting date in "dd/MM/yyyy" format

Mais lorsque je convertis cette date (qui est au format String), elle ajoute également l'heure.

Je ne veux pas du temps du tout. Ce que je veux, c'est simplement "21/03/2012".

56
Laxman Rana

La réponse rapide est:

Non, vous n'êtes pas autorisé à faire cela. Parce que c'est pour cela que Date utilise.

De javadoc de Date:

La classe Date représente un instant spécifique dans le temps, avec une précision d'une milliseconde.

Cependant, puisque cette classe est simplement un objet de données. Peu importe la façon dont nous le décrivons ... Quand nous voyons une date 2012/01/01 12:05:10.321, nous pouvons dire que c’est 2012/01/01, c’est ce dont vous avez besoin ... Il y a plusieurs façons de le faire.

Exemple 1: en manipulant la chaîne

Chaîne d'entrée: 2012/01/20 12: 05: 10.321

Chaîne de sortie souhaitée: 2012/01/20

Puisque yyyy/MM/jj sont exactement ce dont nous avons besoin, nous pouvons simplement manipuler la chaîne pour obtenir le résultat.

String input = "2012/01/20 12:05:10.321";
String output = input.substring(0, 10);  // Output : 2012/01/20

Exemple 2: par SimpleDateFormat

Chaîne d'entrée: 2012/01/20 12: 05: 10.321

Chaîne de sortie souhaitée: 01/20/2012

Dans ce cas, nous voulons un format différent.

String input = "2012/01/20 12:05:10.321";
DateFormat inputFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
Date date = inputFormatter.parse(input);

DateFormat outputFormatter = new SimpleDateFormat("MM/dd/yyyy");
String output = outputFormatter.format(date); // Output : 01/20/2012

Pour utiliser SimpleDateFormat, vérifiez SimpleDateFormat JavaDoc .

41
Rangi Lin

Vous pouvez supprimer la partie temporelle de Java.util.Date en définissant les valeurs heure, minute, seconde et milliseconde sur zéro.

import Java.util.Calendar;
import Java.util.Date;

public class DateUtil {

    public static Date removeTime(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }

}
104
Sunil Manheri

Apache Commons DateUtils a une méthode "tronquer" que je viens d’utiliser pour faire cela et je pense que cela répondra à vos besoins. C'est vraiment facile à utiliser:

DateUtils.truncate(dateYouWantToTruncate, Calendar.DAY_OF_MONTH);

DateUtils possède également une foule d'autres utilitaires tels que "isSameDay ()" et autres. Check it it it! Cela pourrait vous faciliter la tâche.

27
jseals

Et ça:

    Date today = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

    today = sdf.parse(sdf.format(today));
12
user2859573

Ce que vous voulez, c'est impossible.

Un objet Date représente un moment "absolu". Vous ne pouvez pas "enlever la partie du temps". Lorsque vous imprimez un objet Date directement avec System.out.println(date), il sera toujours formaté dans un format par défaut incluant l'heure. Vous ne pouvez rien faire pour changer cela.

Au lieu d'essayer d'utiliser la classe Date pour quelque chose pour lequel elle n'a pas été conçue, vous devriez chercher une autre solution. Par exemple, utilisez SimpleDateFormat pour formater la date dans le format de votre choix.

Les API de date et de calendrier Java ne sont malheureusement pas les classes les mieux conçues de l'API Java standard. Il existe une bibliothèque appelée Joda-Time qui a une API bien meilleure et plus puissante.

Joda-Time propose un certain nombre de classes spéciales pour prendre en charge les dates, heures, périodes, durées, etc. Si vous voulez travailler avec une date sans heure, alors la classe LocalDate de Joda-Time utilisation.

8
Jesper

vous pouvez essayer quelque chose comme ceci:

import Java.text.*;
import Java.util.*;
public class DtTime {
public static void main(String args[]) {
String s;
Format formatter;
  Date date = new Date();
  formatter = new SimpleDateFormat("dd/MM/yyyy");
  s = formatter.format(date);
  System.out.println(s);
    }
}

Cela vous donnera une sortie en tant que21/03/2012

Ou vous pouvez essayer ceci si vous voulez que la sortie soit en tant que 21 Mar, 2012

import Java.text.*;
import Java.util.*;
public class DtTime {
public static void main(String args[]) {
    Date date=new Date();
String df=DateFormat.getDateInstance().format(date);
System.out.println(df);
    }
}
3
heretolearn

Peut-être que le code ci-dessous peut aider les personnes qui recherchent zéro heure du jour:

    Date todayDate = new Date();
    GregorianCalendar todayDate_G = new GregorianCalendar();
    gcd.setTime(currentDate);
    int _Day    = todayDate_GC.get(GregorianCalendar.DAY_OF_MONTH);
    int _Month  = todayDate_GC.get(GregorianCalendar.MONTH);
    int _Year   = todayDate_GC.get(GregorianCalendar.YEAR);

    GregorianCalendar newDate = new GregorianCalendar(_Year,_Month,_Day,0,0,0);
    zeroHourDate = newDate.getTime();
    long zeroHourDateTime = newDate.getTimeInMillis();

J'espère que cela vous sera utile.

3
Kris_P

Vous pouvez écrire cela par exemple:

private Date TruncarFecha(Date fechaParametro) throws ParseException {
    String fecha="";
    DateFormat outputFormatter = new SimpleDateFormat("MM/dd/yyyy");
    fecha =outputFormatter.format(fechaParametro);
    return outputFormatter.parse(fecha);
}
3
Date dateWithoutTime =
    new Date(myDate.getYear(),myDate.getMonth(),myDate.getDate()) 

C'est obsolète, mais c'est le moyen le plus rapide de le faire.

2
Daniel

Un peu fudge mais vous pouvez utiliser Java.sql.Date. Cela ne stockait que la date et l'heure zéro (minuit)

Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, 2011);
c.set(Calendar.MONTH, 11);
c.set(Calendar.DATE, 5);
Java.sql.Date d = new Java.sql.Date(c.getTimeInMillis());
System.out.println("date is  " + d);
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
System.out.println("formatted date is  " + df.format(d));

donne

date is  2011-12-05
formatted date is  05/12/2011

Vous pouvez également créer votre propre objet de date, qui contient uniquement des dates et non des heures. Cela pourrait envelopper Java.util.Date et ignorer les parties temporelles de celui-ci.

1
RNJ

La classe appropriée à utiliser pour une date sans heure est LocalDate. LocalDate fait partie de Java.time, l'API Java moderne pour la date et l'heure.

La meilleure chose à faire est donc de modifier la méthode getStartDate que vous utilisez pour renvoyer une LocalDate:

    DateTimeFormatter dateFormatter = DateTimeFormatter
            .ofLocalizedDate(FormatStyle.SHORT)
            .withLocale(Locale.forLanguageTag("en-IE"));

    LocalDate d = eventList.get(0).getStartDate(); // We’re now getting a LocalDate using this method
    String dateString = d.format(dateFormatter);
    System.out.println(dateString);

Exemple de sortie:

21/03/2012

Si vous ne pouvez pas modifier la getStartDate, vous pourrez peut-être ajouter une nouvelle méthode renvoyant le type souhaité. Cependant, si vous ne pouvez pas vous permettre de le faire maintenant, convertissez la Date à l'ancienne que vous obtenez (je suppose que Java.util.Date):

    d = eventList.get(0).getStartDate(); // I'm getting the old-fashioned Date using this method
    LocalDate dateWithoutTime = d.toInstant()
            .atZone(ZoneId.of("Asia/Kolkata"))
            .toLocalDate();

Veuillez insérer le fuseau horaire supposé pour la Date. Vous pouvez utiliser ZoneId.systemDefault() pour le paramètre de fuseau horaire de la machine virtuelle, mais vous pouvez le modifier à tout moment à partir d’autres parties de votre programme ou de programmes exécutés sur la même machine virtuelle.

La classe Java.util.Date était ce que nous utilisions tous lorsque cette question a été posée il y a 6 ans (non, pas tous; je l'étais et nous étions nombreux). Java.time est sorti quelques années plus tard et a remplacé les anciens Date, Calendar, SimpleDateFormat et DateFormat. Reconnaissant qu'ils étaient mal conçus. De plus, une Date malgré son nom ne peut représenter une date. C’est un moment. L’autre réponse consiste à arrondir l’heure au début de la journée («minuit») dans le fuseau horaire par défaut de la JVM. Elle ne supprime pas l’heure de la journée, elle la règle uniquement, généralement 00:00. Changez votre fuseau horaire par défaut - comme je l’ai dit, même un autre programme exécuté sur la même machine virtuelle peut le faire à tout moment sans préavis - et tout s’arrêtera (souvent).

Link:Tutoriel Oracle: Date Time expliquant comment utiliser Java.time.

1
Ole V.V.

Si vous utilisez Java 8+, utilisez le type Java.time.LocalDate .

LocalDate now = LocalDate.now();
System.out.println(now.toString());

Le résultat:

2019-05-30

https://docs.Oracle.com/javase/8/docs/api/Java/time/LocalDate.html

1
Amy Doxy

Java.util.Date représente un date/heure bas en millisecondes. Vous n'avez pas d'autre choix que d'inclure une heure avec elle. Vous pouvez essayer de réduire le temps, mais les fuseaux horaires et l'heure avancée entrent en jeu - et cela peut tout gâcher dans la ligne (e.g. 21/03/2012 0:00 GMT is 20/03/2012 PDT).

Ce que vous voudrez peut-être, c’est un Java.sql.Date qui ne représente que la partie date (bien qu’il utilise toujours ms en interne).

1
ɲeuroburɳ

Vous pouvez également modifier manuellement la partie heure de la date et du format dans "jj/mm/aaaa" modèle en fonction de vos besoins.

  public static Date getZeroTimeDate(Date changeDate){

        Date returnDate=new Date(changeDate.getTime()-(24*60*60*1000));
        return returnDate;
    }

Si la valeur de retour ne fonctionne pas, recherchez le paramètre context dans web.xml . Eg.

   <context-param> 
        <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
        <param-value>true</param-value>
    </context-param>
0
Rajesh

Une autre façon de travailler ici consiste à utiliser Java.sql.Date en tant que date sql n’a pas de temps associé, alors que Java.util.Date a toujours un horodatage . Ce qui est intéressant ici est Java.sql.Date. étend Java.util.Date, donc la variable Java.util.Date peut être une référence à Java.sql.Date (sans heure) et à Java.util.Date bien sûr (avec horodatage).

0
Sourav
String substring(int startIndex, int endIndex)

En d'autres termes, vous savez que votre chaîne comportera 10 caractères.

FinalDate = date.substring(0,9);
0
Jeremy Sayers

En plus de ce que @jseals a déjà dit. Je pense que la classe org.Apache.commons.lang.time.DateUtils est probablement ce que vous devriez regarder.

C'est la méthode: tronquer (Date date, int) a très bien fonctionné pour moi.

JavaDocs: https://commons.Apache.org/proper/commons-lang/javadocs/api-2.6/org/Apache/commons/lang/time/DateUtils.html#truncate(Java.util.Date , int)

Comme vous aviez besoin de tronquer tous les champs temporels, vous pouvez utiliser:

DateUtils.truncate(new Date(),Calendar.DAY_OF_MONTH)
0
Sahil J

Je ne peux pas croire que personne n'a offert cette réponse merdique avec tous les autres. Il est obsolète depuis des décennies.

@SuppressWarnings("deprecation")
...
    Date hitDate = new Date();
    hitDate.setHours(0);
    hitDate.setMinutes(0);
    hitDate.setSeconds(0);
0
Chloe