Informations sur la date de fermeture de la date de Java

j'ai un objet Date Java contenant des informations sur la date et l'heure. Je veux écrire une méthode qui coupe l'information de temps, tronque les heures-minutes-secondes, donc je n'ai plus que la date.

exemple d'entrée:

2008-01-01 13:15:00

résultats escomptés:

2008-01-01 00:00:00

vous avez un pourboire? J'ai essayé de faire quelque chose comme ceci:

(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)

mais j'ai eu des problèmes avec le fuseau horaire.

93
demandé sur Basil Bourque 2009-12-15 18:55:20

20 réponses

le recommandé la façon de manipuler la date et l'heure est d'utiliser un Calendar objet:

Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(dateObject);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long time = cal.getTimeInMillis();
152
répondu cletus 2009-12-15 16:35:10

avez-vous regardé la DateUtils méthode tronquée dans Apache Commons Lang?

Date truncatedDate = DateUtils.truncate(new Date(), Calendar.DATE);

supprimera l'élément temps.

124
répondu A_M 2014-01-31 21:00:13

avez-vous regardé Joda ? C'est une beaucoup façon plus facile et intuitive de travailler avec les dates et les heures. Par exemple, vous pouvez convertir trivialement entre (dire) LocalDateTime et LocalDate objets.

p.ex. (pour illustrer L'API)

LocalDate date = new LocalDateTime(milliseconds).toLocalDate()

en outre, il résout certains problèmes de sécurité fil avec date / heure formatteurs et doit être fortement recommandé pour travailler avec des problèmes de date/heure en Java.

37
répondu Brian Agnew 2009-12-15 16:41:18
Date date = new 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);
date = cal.getTime();
23
répondu jitter 2009-12-15 16:01:13

avec Joda vous pouvez facilement obtenir la date prévue.

à partir de la version 2.7 (peut-être depuis une version précédente supérieure à 2.2), comme un commentateur note, toDateMidnight a été déprécié en faveur ou le bien nommé withTimeAtStartOfDay() , ce qui rend le pratique

DateTime.now().withTimeAtStartOfDay()

possible.

avantage ajouté d'une API beaucoup plus agréable.

avec des versions plus anciennes, vous pouvez faire

new DateTime(new Date()).toDateMidnight().toDate()
20
répondu h7r 2015-09-26 13:55:34

juste une mise à jour rapide à la lumière du java.les classes de temps maintenant intégrées dans Java 8 et plus tard.

LocalDateTime a une truncatedTo méthode qui aborde efficacement ce que vous parlez ici:

LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES)

cela exprimera l'heure actuelle en minutes seulement:

2015-03-05T11:47

vous pouvez utiliser n'importe quel ChronoUnit (ou TemporalUnit ) pour exécuter la troncature.

20
répondu Adam Berry 2016-08-19 19:45:36

pour les horodateurs:

timestamp -= timestamp % (24 * 60 * 60 * 1000)
7
répondu Gan Quan 2015-01-16 22:17:58

utiliser des DateUtils D'Apache, avec troncature, comme ceci:

DateUtils.truncate(Calendar.getInstance().getTime(), Calendar.DATE);
6
répondu Byron Marambio Troncoso 2012-08-02 18:31:00

j'ai fait la troncature avec la nouvelle API java8. J'ai affronté une chose étrange, mais en général, c'est tronqué...

Instant instant = date.toInstant();
instant = instant.truncatedTo(ChronoUnit.DAYS);
date = Date.from(instant);
4
répondu Sergio Kosik 2014-09-29 10:07:04

de java.util.Date JavaDocs:

la date de classe représente un instant précis dans le temps, avec une précision de milliseconde

et de la java.SQL.Date JavaDocs:

pour se conformer à la définition de date SQL, les valeurs millisecondes enveloppées par un java.SQL.Date d'instance doit être 'normalisé' les heures, les minutes, les secondes et les millisecondes à zéro dans le fuseau horaire auquel l'instance est associée.

Donc, la meilleure approche est d'utiliser java.SQL.Date si vous n'avez pas besoin de la partie de temps

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());

et la sortie est:

java.util.Date : Thu Apr 26 16:22:53 PST 2012
java.sql.Date  : 2012-04-26
3
répondu Sunil Manheri 2012-04-26 10:52:46

utilisez la méthode Calendar class's set() pour mettre à zéro les champs HOUR_OF_DAY, MINUTE, SECOND et MILLISECOND .

2
répondu Michael Borgwardt 2009-12-15 15:59:27

la question est contradictoire. Il demande une date sans Heure de la journée mais affiche un exemple avec une heure de 00:00:00 .

Joda-Time

UPDATE: le projet Joda-Time est maintenant en mode maintenance , l'équipe conseillant la migration vers le java.temps classes. Voir mon autre réponse pour java.temps solution.

si vous voulez que l'heure du jour soit fixée au premier moment de la journée, utilisez un objet DateTime sur la bibliothèque Joda-Time et appelez sa méthode withTimeAtStartOfDay . Soyez conscient que le premier moment peut ne pas être l'heure 00:00:00 en raison de L'heure D'été ou peut-être d'autres anomalies.

2
répondu Basil Bourque 2018-03-28 00:28:30

juste clear() champs redondants.

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);
Date truncatedDate = calendar.getTime();
1
répondu m190 2013-06-28 07:05:31

cela m'a vraiment ennuyé que le nouveau constructeur de calendrier" amélioré "ne prenne pas un int pendant des millisecondes comme le" terrible " Vieux Date one. Je me suis alors vraiment fâché et j'ai écrit ceci:

long stuffYou = startTime.getTimeInMillis() % 1000;
startTime.setTimeInMillis(startTime.getTimeInMillis() - stuffYou);

je n'ai pas utilisé le mot "trucs" à l'époque, mais puis j'ai découvert le bonheur de ceci:

startTime.set(Calendar.MILLISECOND, 0);

mais je suis toujours assez en colère à ce sujet.

1
répondu Dave 2013-09-24 13:43:00

Vous pouvez faire pour éviter de fuseau horaire question:

public static Date truncDate(Date date) {
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    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();
}

bien que L'objet Java Date soit une valeur de timestamp, mais pendant la troncature, il sera converti en timezone locale, donc vous obtiendrez une valeur surprenante si vous attendez une valeur de UTC timezone.

1
répondu GMsoF 2018-03-13 09:58:46

tl; dr

LocalDateTime.parse(                            // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
    "2008-01-01 13:15:00".replace( " " , "T" )  // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate()                                  // Extract a date-only value.
.atStartOfDay(                                  // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
    ZoneId.of( "Europe/Paris" )                 // Determining a specific start-of-day requires a time zone.
)                                               // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString()                                     // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.

2008-01-01T00:00+01:00[Europe/Paris]

pour générer une chaîne dans le format de votre choix, passez un DateTimeFormatter .

LocalDateTime.parse(                            // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
    "2008-01-01 13:15:00".replace( " " , "T" )  // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate()                                  // Extract a date-only value.
.atStartOfDay(                                  // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
    ZoneId.of( "Europe/Paris" )                 // Determining a specific start-of-day requires a time zone.
)                                               // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format(                                        // Generate a String representing the object’s value.
    DateTimeFormatter.ISO_LOCAL_DATE_TIME       // Built-in predefined formatter close to what you want. 
)
.replace( "T" , " " )                           // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.

2008-01-01 00:00:00

détails

D'autres réponses sont correctes, mais utiliser les anciennes classes de date - heure maintenant dépassées par le Java.cadre de temps.

de java.temps

La java.time framework est intégré à Java 8 et plus tard. Une grande partie de la java.la fonctionnalité time est rétroportée à Java 6 & 7 ( ThreeTen-Backport ) et adaptée à Android ( ThreeTenABP ).

modifier D'abord la chaîne de saisie pour se conformer à la version canonique du format ISO 8601. La norme ISO 8601 les formats sont utilisés par défaut en java.classes de temps pour analyser/générer des chaînes qui représentent des valeurs date-heure. Nous devons remplacer cet espace au milieu par un T .

String input = "2008-01-01 13:15:00".replace( " " , "T" );  // → 2008-01-01T13:15:00

maintenant nous pouvons le parser comme un LocalDateTime , où "Local" signifie aucune localité spécifique. Il n'y a pas de offset-from-UTC ou de renseignements sur les fuseaux horaires.

LocalDateTime ldt = LocalDateTime.parse( input );

ldt.toString()… 2008-01-01T13: 15: 00

si vous ne vous souciez pas de l'heure ni du fuseau horaire, convertissez-vous en LocalDate .

LocalDate ld = ldt.toLocalDate();

ld.toString () ... 2008-01-01

Premier Moment Du Jour

si vous voulez que l'Heure de la journée soit fixée au premier moment de la journée, utilisez une classe" 1519790920 ZonedDateTime 1519360920", puis convertissez à un LocalDate objet pour appeler son atStartOfDay méthode. Soyez conscient que le premier moment peut ne pas être l'heure 00:00:00 en raison de L'heure D'été ou peut-être d'autres anomalies.

le fuseau horaire est crucial car pour un moment donné la date varie autour du monde par zone. Par exemple, quelques instants après minuit à Paris est un jour nouveau pour les Parisiens, mais est encore "hier" à Montréal pour les Canadiens.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );

zdtStartOfDay.toString () ... 2008-01-01T00: 00:00-05: 00[America/Montreal]

UTC

pour voir ce moment à travers la lentille du fuseau horaire UTC , extraire un objet Instant . Les deux ZonedDateTime et Instant représenteront le même moment sur la ligne de temps mais apparaîtront comme deux temps d'horloge muraux différents .

An Instant est la classe de base des blocs de construction en java.temps, toujours en TUC par définition. Utilisez cette classe fréquemment, car vous devriez généralement faire votre logique d'affaires, le stockage de données, et l'échange de données dans UTC.

Instant instant = zdtStartOfDay.toInstant();

instant.ToString () ... 2008-01-01T05: 00 :00Z

Nous voyons 5 h du matin, plutôt que de la course-de-minuit. En format standard, le Z end est l'abréviation de Zulu et signifie"UTC".


à Propos de de java.heure

Le de java.time framework est construit dans Java 8 et plus tard. Ces classes remplacent les anciennes classes de date legacy telles que java.util.Date , Calendar , & SimpleDateFormat .

le Joda-Time projet, maintenant en mode maintenance , conseille la migration vers le java.temps des classes.

pour en savoir plus, voir le Oracle Tutorial . Et rechercher le débordement de la pile pour de nombreux exemples et explications. La spécification est JSR 310 .

vous pouvez échanger java.temps objets directement avec votre base de données. Utiliser un JDBC driver conforme à JDBC 4.2 ou plus tard. Pas besoin de Chaînes, pas besoin de classes java.sql.* .

où obtenir le java.les classes de temps?

le projet ThreeTen-Extra étend java.temps avec des cours supplémentaires. Ce le projet est un terrain d'essai pour d'éventuelles futures additions à java.temps. Vous pouvez trouver ici quelques cours utiles tels que: Interval , YearWeek , YearQuarter , et plus .

1
répondu Basil Bourque 2018-03-28 00:24:24

pourrait être une réponse tardive, mais voici un moyen de le faire en une seule ligne sans utiliser de bibliothèques:

new SimpleDateFormat("yyyy-MM-dd").parse(new SimpleDateFormat("yyyy-MM-dd").format(YOUR_TIMESTAMP))
0
répondu Alex 2014-06-20 12:53:00

avec Joda-Time depuis la version 2.0, vous pouvez utiliser LocalDate.toDate() .

tout simplement

// someDatetime is whatever java.util.Date you have.
Date someDay = new LocalDate(someDatetime).toDate();
0
répondu lamusique 2014-07-08 04:24:51

pour toutes les réponses en utilisant Calendar, vous devriez l'utiliser comme ceci à la place

public static Date truncateDate(Date date) {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.HOUR_OF_DAY, c.getActualMinimum(Calendar.HOUR_OF_DAY));
    c.set(Calendar.MINUTE, c.getActualMinimum(Calendar.MINUTE));
    c.set(Calendar.SECOND, c.getActualMinimum(Calendar.SECOND));
    c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND));
    return c.getTime();
}

mais je préfère ceci:

public static Date truncateDate(Date date) {
    return new java.sql.Date(date.getTime());
}
0
répondu Guest 2016-06-16 11:41:07

j'ai résolu le problème comme ceci(dans l'est de huit horaire(heure de Beijing)):

private Date getTruncatedDate(Date d) {
    if (d == null) {
        return null;
    }
    long h = 60 * 60 * 1000L;
    long dateStamp = d.getTime() - (d.getTime() + 8 * h) % (24 * h);
    return new Date(dateStamp);
}

tout d'abord, vous devez être clair ce qui est horodatage. L'heure est la milliseconde totale à partir de Jan 01 00: 00: 00 1970 de GMT (même que UTC), ou Thu Jan 01 08:00:00 CST 1970 jusqu'à maintenant.

rappelez - vous que L'horodatage est indépendant du fuseau horaire.

donc vous obtenez le même résultat avec le déclaration suivante dans des fuseaux horaires différents:

System.out.println(new Date().getTime());

et

System.out.println(new Date(0));

imprime des informations horaires différentes dans différents fuseaux horaires: Si vous définissez votre fuseau horaire pc comme UTC, vous obtenez

Thu Jan 01 00:00:00 UTC 1970

mais si vous définissez le fuseau horaire comme (UTC +8:00) Pékin, Chongqing, HongKong, Urumq, vous obtenez:

Thu Jan 01 08:00:00 CST 1970

Java obtient l'horodatage, puis affiche la date et l'heure info selon le fuseau horaire.

pour l'introduction de la façon dont Java affiche les informations de date et d'heure dans différents fuseaux horaires, comment traduire les informations de temps est facile. Vous devriez obtenir l'horodatage , et prendre le fuseau horaire en compte quand couper l'information de temps. Ensuite, vous pouvez créer un nouvel objet Date avec l'horodatage cut(nous pouvons l'appeler horodatage), java compensera le fuseau horaire lorsque les informations de date s'affichent.

comme dans la zone huit de L'est(Heure de Pékin), l'Heure de Pékin est antérieure 8 heures que GMT, donc vous devriez soustraire plus de 8 heures quand vous faites l'opération modulo. C'est à dire, vous devriez obtenir L'heure GMT d'abord, puis Java ajoutera 8 heures lorsque l'heure d'affichage basé sur le réglage de fuseau horaire de votre pc.


la question des fuseaux horaires est obscure, et me laisse perplexe depuis longtemps. Maintenant, je le précise. Espoir aide.


2018-01-04 La méthode ci-dessous fonctionne également.

private Date getTruncatedDate2(Date d) {
    Calendar cal = Calendar.getInstance(); // locale-specific
    cal.setTime(d);
    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();

}

0
répondu Gelbert 2018-01-04 02:07:12