2016-10-14 1 views
1

Je veux convertir l'objet org.joda.time.LocalDate en java.util.GregorianCalendar. java.util.GregorianCalendar mois affiché de l'index 0 à 11. Donc Octobre est représenté par le chiffre 9, Novembre avec le chiffre 10 .... Alors que pour LocalDate Octobre est représenté par le chiffre 10, novembre avec 11 ....convertir la date en GregorianCalendar Format de date

Je travaille sur une application existante où ils ont utilisé GregorianCalendar. Maintenant, je veux convertir ma valeur LocalDate que j'ai reçue à travers un appel de méthode en format GregorianCalendar afin que les valeurs du mois correspondent.

J'ai déjà recherché de nombreux blogs mais je n'ai pas pu convertir la valeur. Ci-dessous le code que j'ai essayé mais qui ne pouvait toujours pas changer le format de la date au format GregorianCalendar.

code java:

import java.text.SimpleDateFormat; 
import java.util.GregorianCalendar; 
import org.joda.time.DateTime; 
import org.joda.time.LocalDate; 
class Convert{ 
    public static String format(GregorianCalendar calendar){ 
     SimpleDateFormat fmt = new SimpleDateFormat("dd-M-yyyy"); 
     fmt.setCalendar(calendar); 
     String dateFormatted = fmt.format(calendar.getTime()); 
     System.out.println("--date formatted--- " + dateFormatted); 
     return dateFormatted; 
    } 
    void convertLocalDateToGregorianCalendar(){ 
     LocalDate localDate = new LocalDate(); 
     DateTime dateTimeObj = localDate.toDateTimeAtStartOfDay(); 
     GregorianCalendar gc = new GregorianCalendar(); 
     gc.setTimeInMillis(dateTimeObj.getMillis()); 
     String formattedGCDate = format(gc); 
     System.out.println("converted LocalDate to GregorianDate date value " + formattedGCDate); 
    } 
    public static void main(String[] args) { 
       new Convert().convertLocalDateToGregorianCalendar();   
} } 

Sortie:

--date formatted--- 13-10-2016 
converted LocalDate to GregorianDate date value 13-10-2016 

valeur Date prévue dans la sortie: 13-9-2016 (En ce qui concerne GregorianCalendar mois Octobre est à représenter le chiffre 9).

PS: java5 est la version que j'utilise.

Répondre

1

Si je comprends la bonne question que nous mélangeons 2 choses

a) la représentation interne des mois dans Calandre/GregorianCalender et le calendrier réel lui-même. La représentation interne, comme vous le dites à juste titre, est représentée de 0 à 11, soit 12 mois de l'année, l'interprétation humaine étant de 1 à 12 mois de l'année. Lorsque vous appelez l'opération de formatage, vous obtenez la façon dont la date apparaît sur un calendrier humain réel qui est le mois d'octobre, le mois 10 de l'année. La représentation interne est toujours 9. Si vous demandez comment, vous pouvez vérifier en utilisant l'API

gc.setTimeInMillis(dateTimeObj.getMillis()); 
System.out.println(gc.get(Calendar.MONTH)); 

Cette affiche le chiffre 9

Si vous voulez que la représentation interne de la date, vous pouvez le faire aussi. Une manière vraiment hacky serait comme suit bien que je ne me porte pas garant, mais vous donne une idée globale des choses.

LocalDate localDate = new LocalDate(); 
DateTime dateTimeObj = localDate.toDateTimeAtStartOfDay(); 
GregorianCalendar gc = new GregorianCalendar(); 
gc.setTimeInMillis(dateTimeObj.getMillis()); 
System.out.println(gc.get(Calendar.DAY_OF_MONTH) +"-"+ ("00"+ gc.get(Calendar.MONTH)).substring(1) +"-"+gc.get(Calendar.YEAR)); 
1

Je pense que vous ne pouvez pas utiliser SimpleDateFormat pour formater la date grégorienne. J'ai deux suggestions autour de travail:

1. Si vous ne vous pouvez rouler (ou ajouter) soin de ne pas réutiliser le calendar.getTime() le mois par -1 avant fmt.format:

SimpleDateFormat fmt = new SimpleDateFormat("dd-M-yyyy"); 
fmt.setCalendar(calendar);  
calendar.roll(Calendar.MONTH, -1); //or add 
String dateFormatted = fmt.format(calendar.getTime()); 
System.out.println("--date formatted--- " + dateFormatted); 

2.Don't utilisation SimpleDateFormat, calendar.get (Calendar.MONTH) retournera 9 comme attendre:

public static String format(GregorianCalendar calendar){ 
    String dateFormatted = String.format("%s-%s-%s", calendar.get(Calendar.DATE), 
          calendar.get(Calendar.MONTH), calendar.get(Calendar.YEAR)); 
    System.out.println("--date formatted--- " + dateFormatted); 
    return dateFormatted; 
} 
1

tl; dr

java.util.GregorianCalendar.from( 
    java.time.LocalDate.parse(myJodaLocalDate.toString()) 
    .atStartOfDay(ZoneId.of("America/Montreal")) 
) 

Détails

Vous confondez deux très différentes bibliothèques à temps Date:

  • Joda-Time
  • cours Date à temps l'héritage avec Java

Les anciens anciennes classes date temps sont mal -conçu, déroutant et gênant; évite-les. Supplantée par les classes java.time.

Le projet Joda-Time est excellent et a inspiré java.time. Mais maintenant le projet est dans maintenance mode, avec l'équipe conseillant la migration vers les classes java.time.

java.time

Convertissez votre org.joda.time.LocalDate à un java.time.LocalDate en passant par une chaîne. Les deux utilisent les formats standard ISO 8601 par défaut, donc pas besoin de spécifier un modèle de formatage.

java.time.LocalDate ld = java.time.LocalDate.parse(myJodaLocalDate.toString()); 

Vous voulez apparemment une valeur date-heure, nous avons donc besoin d'ajouter un temps de jour à votre date que LocalDate. Apparemment, vous voulez aller avec le premier moment de la journée. Ne supposez pas que ce premier moment est 00:00:00 car des anomalies telles que l'heure d'été (DST) peuvent signifier une autre fois, par exemple 01:00:00. Laissez java.time déterminer le moment. Vous devez spécifier votre fuseau horaire souhaité/prévu pour prendre en compte de telles anomalies et ajuster le wall-clock time.

Le code de votre question ignore ce problème crucial de fuseau horaire. Si elle est ignorée, le fuseau horaire par défaut actuel de votre machine virtuelle Java est implicitement appliqué. Cette valeur par défaut peut changer à tout moment pendant runtime. Mieux vaut être explicite.

ZoneId z = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = ld.atStartOfDay(z); 

Je vous suggère fortement de vous en tenir aux classes java.time. Mais si vous avez absolument besoin des anciennes classes héritées, comme pour l'interfaçage avec l'ancien code qui n'a pas encore été mis à jour vers java.time, alors vous pouvez convertir. Regardez les nouvelles méthodes ajoutées aux anciennes classes.

GregorianCalendar gc = java.util.GregorianCalendar.from(zdt); 

indexation Mois

La question demande comment générer une chaîne avec le nombre de mois comme pour correspondre à la façon dont GregorianCalendar fonctionne en interne pour Janvier à Décembre, l'indice de base zéro 0-11. Franchement, répondre à cela serait un mauvais service. Numéroter des mois avec un nombre basé sur zéro est fou fou fou. Cela ne causerait pas de fin à la confusion. Faire cela dans GregorianCalendar était un choix de conception extrêmement pauvre pour commencer. Son utilisation devrait être éteinte plutôt que promue.


A propos java.time

Le cadre java.time est construit en Java 8 et versions ultérieures. Ces classes remplacent les vieilles classes de date-heure legacy gênantes telles que java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Le projet Joda-Time, maintenant dans maintenance mode, conseille la migration vers java.time.

Pour en savoir plus, voir le Oracle Tutorial. Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310.

Où obtenir les classes java.time?

  • Java SE 8 et SE 9 et plus tard
    • intégré.
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et SE 7
    • Une grande partie de la java.la fonctionnalité temporelle est portée sur Java 6 & 7 dans ThreeTen-Backport.
  • Android
    • Le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus) pour les applications en particulier.
    • Voir How to use….

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