9 votes

Création d'une copie temporaire d'un objet Calendrier en Java

Je dois trouver un moyen de créer un fichier temporaire de Calendar (une copie d'un calendrier "permanent" qui existe déjà) afin que je puisse manipuler la copie : tempCal.add(unit, value) . J'ai besoin de garder l'objet calendrier original inchangé, donc je ne veux pas appeler add(unit, value) directement.

Étant donné qu'aucune de mes tentatives de création d'une copie n'a fonctionné, ma méthode actuelle consiste à appeler permanentCal.add(unit, value) afficher les résultats souhaités, puis appeler permanentCal.add (unit, -value) - ce qui n'est pas très cool.

20voto

Alberto Zaccagni Points 11478

java.util.Calendar a une clone vous pouvez l'utiliser. Toutes les données qu'elle contient sont constituées de primitives, vous ne rencontrerez donc pas de problèmes.

Jetez un coup d'œil à ces réponses :

3voto

Si vous souhaitez utiliser l'heure, le jour, le mois, la semaine, l'année, etc. à des fins de calcul, vous pouvez copier à l'aide de la fonction timeInMillis comme suit :

Calendar calendarCopy = Calendar.getInstance()
calendarCopy.setTimeInMillis(calendarOriginal.getTimeInMillis)
doSomethingWith(calendarCopy)

Vous pouvez ainsi indiquer l'heure, le jour, le mois, la semaine, l'année, etc. à l'intérieur du texte.

2voto

Joop Eggen Points 30166

(Pas pour Android)

Passer à l'immuable de Java 8 LocalDateTime le successeur de Calendar/Date. Cette API représente une immense amélioration, et peut être un peu déroutante au début.

Il existe une méthode comme minusDays(long) renverra un nouveau date. Ce qui permet de sécuriser le fil de discussion et tout le reste. Par exemple, il est possible de partager une valeur sans craindre que quelqu'un la modifie.

2voto

Basil Bourque Points 8938

java.time.ZonedDateTime

En Calendar est terrible, tout comme sa classe concrète habituelle, GregorianCalendar . Ces classes héritées du passé ont été supplantées il y a plusieurs années par les classes modernes. java.time les classes, en particulier ZonedDateTime .

En cas de rencontre avec un Calendar pour voir s'il s'agit bien d'un objet GregorianCalendar objet. Si c'est le cas, la conversion se fait à l'aide du nouveau to… / from… ajoutées aux anciennes classes.

if( myCal instanceof GregorianCalendar ) {
    GregorianCalendar gc = ( GregorianCalendar ) myCal ;  // Cast to the concrete type.
    ZonedDateTime zdt = gc.toZonedDateTime() ;  // Convert from legacy class to modern class.
}

Objets immuables

En java.time les classes utilisent à bon escient les objets immuables Les produits de l'industrie de l'automobile sont des produits de qualité, avec des motifs appropriés à leur objectif.

Vous ne pouvez donc pas manipuler les champs individuels d'un membre dans un objet existant. Au lieu de cela, vous transmettez une nouvelle valeur de champ pour produire un nouvel objet basé sur la combinaison des valeurs d'origine et de votre valeur spécifique différente. Voir l'article with des méthodes.

Ajouter/soustraire une période de temps

Dans votre cas, il semble que vous souhaitiez effectuer une addition ou une soustraction pour arriver à un nouveau moment.

Spécifiez un intervalle de temps à l'aide de la touche :

  • Duration pour une échelle heures-minutes-secondes
  • Period pour une échelle d'années-mois-jours.

Exemple : Ajouter quelques jours pour obtenir un moment plus tard.

Period p = Period.ofDays( 3 ) ;  
ZonedDateTime threeDaysLater = zdt.plus( p ) ;

Pour effectuer ce type de travail, vous pouvez utiliser les outils suivants Interval y LocalDateRange les cours proposés par le ThreeTen-Extra dont le lien figure ci-dessous.


A propos de java.time

En java.time est intégré à Java 8 et aux versions ultérieures. Ces classes remplacent les anciennes classes héritage les classes de date et d'heure telles que java.util.Date , Calendar , & SimpleDateFormat .

Pour en savoir plus, consultez le site Tutoriel Oracle . Vous trouverez de nombreux exemples et explications sur Stack Overflow. La spécification est JSR 310 .

En Joda-Time Le projet, en cours d'élaboration, est en cours de réalisation. mode de maintenance conseille de migrer vers l java.time classes.

Vous pouvez échanger java.time directement avec votre base de données. L'utilisation d'un Pilote JDBC conforme à JDBC 4.2 ou plus tard. Pas besoin de ficelles, pas besoin de java.sql.* classes.

Où obtenir les classes java.time ?

enter image description here

En ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time. Vous pouvez y trouver des classes utiles telles que Interval , YearWeek , YearQuarter et plus .

1voto

Grzegorz Gajos Points 443

Joda-Time

Si vous voulez le faire à la cool, utilisez la fonction Joda-Time bibliothèque.

Ce cadre de gestion de la date et de l'heure, qui a connu un grand succès auprès de tiers, a été à l'origine de la création de l'application java.time désormais intégré à Java 8 et aux versions ultérieures.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X