IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

oracle conversion de date et jour julien


Sujet :

JDBC Java

  1. #1
    Membre régulier Avatar de corwin
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 85
    Points : 77
    Points
    77
    Par défaut oracle conversion de date et jour julien
    (Finalement je suis pas sur de poster au bon endroit)

    Bonjour,

    je travaille actuellement sur un code java qui récupère des date dans une base oracle. Je suis sur un problème de conversion.
    De la base je récupère une date au format Oracle "JSSSSS" sous forme de String.
    J'en extrait deux nombres :
    le jour julien (J) style 2454610
    le nombre de second dans ce jour (SSSSS) style 29168
    Maintenant je travail avec une lib java qui a besoin d'un timestamp unix (second depuis epoch )
    Je me demandais si il y avait déja des chose pour faire la conversion ?
    J'était parti pour utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    import java.sql.Date;
    import java.util.GregorianCalendar;
    import java.util.Calendar;
    mon idée était de :
    1/ créer une Date() epoch
    2/ obtenir le jour julien correspondant
    3/ soustraire du nombre de jour (J)
    3/ convertir en seconde
    4/ ajouter les secondes (SSSSS)

    le point 2/ me pose problème ??

    mais cela me semble bizarre q'il n'y ai pas quelque chose pour faire cela. Pour le moment mes recherches son infructueuses.

    Si quelqu'un a une suggestion ? ou une remarque car peut etre que je me plante.
    Remarquer que c'est la premiere fois que je bosse avec oracle.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Il y a un objet Julian calendar dans java, qui pourait t'être utile.
    Aussi, quel choix de format curieux dans la DB. Il est trop tard pour obter pour un vrai champ date dans la db plutot qu'une string?

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    aussi convertir un champ Date en Jour (peut importe la base) et éventuellement secondes nécessite de savoir dans quelle timezone on travaille , sinon, si tu te goure de timezone, tu va avoir un décalage de un jour.

  4. #4
    Membre régulier Avatar de corwin
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 85
    Points : 77
    Points
    77
    Par défaut
    Merci pour la reponse mais j avais déjà été jeté un oeil sur le GregorianCalendar and co. (julien, etc)
    D'ailleur j'en était rester aux classe Date en java deprecated maintenant.
    Pour le moment ce que je vois c'est que le jour julien n'est pas géré dans java.
    J'ai trouver une lib d astronomie qui gère peut être comme je veux.
    je reposterais mes découvertes
    Pour le coup de la base en fait c'est super pratique pour faire des différence de jour, classer etc... courament utiliser en astro et géophysique. Quoi que la c'est une base en milieu assurance/banque
    aller j'y retour faire mes test

  5. #5
    Membre régulier Avatar de corwin
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 85
    Points : 77
    Points
    77
    Par défaut
    Bon et bien j'ai résolu mon problème après avoir jouer pas mal. Donc je poste histoire que cela serve a d'autre :
    Déjà un petit lien pour les explications sur les jours julien
    Petit passage par chez sun pour les explications sur :
    java.util.Calendar et java.util.GregorianCalendar
    java.util.TimeZone
    Ensuite j'ai trouver deux libs une lib d'astronomie
    une lib provenat de chez sun mais un peu vieille

    Pour cette dernière on pourra l'amélioré en changeant le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    /**
        * Constructs the current date (uses java.util.Calendar class)
        */
       public UTCDate() {
         int ymdhms[] = new int[6];
         Calendar cal = new GregorianCalendar();
         ymdhms[0] = cal.get(Calendar.YEAR);
         ymdhms[1] = cal.get(Calendar.MONTH) + 1;
         ymdhms[2] = cal.get(Calendar.DAY_OF_MONTH);  //day of month
         ymdhms[3] = cal.get(Calendar.HOUR_OF_DAY);
         ymdhms[4] = cal.get(Calendar.MINUTE);
         ymdhms[5] = cal.get(Calendar.SECOND);
     
          setSecsDays(ymdhms);
          //convert to UTC
          int offset = -(cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) / (60 * 1000);
          /**
           * deprecated
           * today.getTgetTimezoneOffset();
           */
          addMinutes(offset);
       }
    voila et ensuite un petit test avec la requete oracle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    import cds.astro.Astrotime;
    import java.util.Calendar;
    import java.util.GregorianCalendar;
    import java.util.TimeZone;
     
    class testJulianDay {
     
    	public static void main(String args[]) {
    		// select to_char(to_date('23/05/2008 10:32:45','DD/MM/YYYY HH24:MI:SS'),'JSSSSS') from dual;
    		// result = 245461037965
    		// current date  = 23 May 2008 , 10H 32M 45s, julian day = 2454610
    		String oracleStr = "245461037965";
    		long julian = Integer.valueOf(oracleStr.substring(0, 7));
    		long second = Integer.valueOf(oracleStr.substring(7));
     
    		System.out.println("julian day = "+String.valueOf(julian));
    		System.out.println("second of the day = "+String.valueOf(second));
     
    		long offset = 2*3600*1000;
    		System.out.println("offset "+offset);
     
    		int[] ymd = new int[3];
    		Astrotime.JD2YMD(julian, ymd);
    		System.out.println("Y="+ymd[0]+" M="+ymd[1]+" d="+ymd[2]);
     
    		Calendar cal2 = new GregorianCalendar();
    		cal2.setTimeZone(TimeZone.getTimeZone("")); // GMT
    		cal2.setTimeInMillis(Astrotime.JD2ms(julian-0.5));
     
    		long as1 = cal2.getTimeInMillis()+second*1000;
    		System.out.println("Astr unix time = "+as1);
     
    		Calendar cal = new GregorianCalendar(2008, 4, 23, 10, 32, 45);
    		cal.setTimeZone(TimeZone.getTimeZone("")); // GMT
    		System.out.println("date unix time = "+cal.getTimeInMillis());
     
    		UTCDate d1 = new UTCDate(1970,1,1);
    		long dj = d1.getJulian();
    		long s= ((julian-dj)*24*3600+second)*1000;
    		System.out.println("UTC1 unix time = "+s);
     
    		System.out.println("time zone ="+cal2.getTimeZone());
    		System.out.println("time zone ="+cal.getTimeZone());
    	}
     
    }
    on pourra notamment jouer avec la timezone (activé ou non) en commentant les ligne setTimeZone.
    Après tout dépend de la référence de temps de la base (GMT ou Fuseau horaire).

    L'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    julian day = 2454610
    second of the day = 37965
    offset 7200000
    Y=2008 M=4 d=23
    Astr unix time = 1211538765000
    date unix time = 1211538765000
    UTC1 unix time = 1211538765000
    time zone =sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
    time zone =sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
    voila ou reste plus qu'a choisir entre les deux une lib ou un fichier.
    Le mois prochain je vais bosser en astro je vais garder cette lib sous le coude

  6. #6
    Membre régulier Avatar de corwin
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 85
    Points : 77
    Points
    77
    Par défaut
    je rajoute une remarque concernant l'usage de la lib Astrotime.
    On fera attention au julian-0.5 car les astronome utilise le vrai jour julien et dans oracle c'est le jour julien chronologique
    jour julien chronologique (CJD) = jour julien astronomique (AJD)+ 0.5
    et la variable julian est donc un CJD => CJD-0.5 = AJD
    ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/07/2008, 15h06
  2. [Oracle] [débutant] Date du jour
    Par kilian dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/01/2007, 14h14
  3. Conversion de date Sous Oracle 9i
    Par filton dans le forum Oracle
    Réponses: 1
    Dernier message: 30/06/2006, 11h49
  4. [Oracle] Date(oracle) => Année saisie sur 4 jours, retournée sur 2
    Par romulus dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/03/2006, 03h14
  5. conversion de date (delphi/oracle)
    Par dolphins dans le forum Bases de données
    Réponses: 1
    Dernier message: 26/09/2005, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo