Jour julien de l'année en Java

j'ai vu la "solution" à http://www.rgagnon.com/javadetails/java-0506.html, mais il ne fonctionne pas correctement. Par exemple: hier (8 juin) aurait dû être 159, mais il a dit qu'il était 245.

alors, est - ce que Quelqu'un a une solution en Java pour obtenir le Julian day à trois chiffres de la date actuelle (pas Julian date-j'ai besoin du jour cette année)?

Merci! Marque

14
demandé sur Mark 2010-06-09 16:03:34

6 réponses

si tout ce que vous voulez est le jour de l'année, pourquoi n'utilisez-vous pas simplement les indicateurs grégoriens DAY_OF_YEAR champ?

import java.util.GregorianCalendar;
public class CalTest {
    public static void main(String[] argv) {
        GregorianCalendar gc = new GregorianCalendar();
        gc.set(GregorianCalendar.DAY_OF_MONTH, 8);
        gc.set(GregorianCalendar.MONTH, GregorianCalendar.JUNE);
        gc.set(GregorianCalendar.YEAR, 2010);
        System.out.println(gc.get(GregorianCalendar.DAY_OF_YEAR));
}

}

vous pouvez aussi calculer la différence entre la date julienne d'aujourd'hui et celle du 1er janvier de cette année. Mais assurez-vous d'ajouter 1 au résultat, depuis le 1er janvier n'est pas le zéro jour de l'année:

int[] now = {2010, 6, 8};
int[] janFirst = {2010, 1, 1};
double dayOfYear = toJulian(now) - toJulian(janFirst) + 1
System.out.println(Double.valueOf(dayOfYear).intValue());
5
répondu wallenborn 2010-06-09 12:32:48
DateFormat d = new SimpleDateFormat("D");
System.out.println(d.format(date));
8
répondu mariami 2013-06-26 11:06:17
import java.util.Calendar;
// ...
final int julianDay = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);

notez que cela ne tient pas compte de l'accord" commence à midi " réclamé par ce site bizarre que vous avez mentionné. Cela pourrait être corrigé en vérifiant l'heure, bien sûr.

5
répondu Pointy 2010-06-09 12:08:25

si nous obtenons un double rendez-vous avec julian tel que chordiant decision manager

http://java.ittoolbox.com/groups/technical-functional/java-l/java-function-to-convert-julian-date-to-calendar-date-1947446

ce qui suit fonctionne mais le second n'est pas pris en charge Comment puis-je convertir entre une date Java et le numéro Julian day?

public static String julianDate (String julianDateStr) {

    try{
        // Calcul date calendrier Gr?gorien ? partir du jour Julien ?ph?m?ride 
        // Tous les calculs sont issus du livre de Jean MEEUS "Calcul astronomique" 
        // Chapitre 3 de la soci?t? astronomique de France 3 rue Beethoven 75016 Paris 
        // Tel 01 42 24 13 74 
        // Valable pour les ann?es n?gatives et positives mais pas pour les jours Juliens n?gatifs
        double jd=Double.parseDouble(julianDateStr);
          double z, f, a, b, c, d, e, m, aux;
            Date date = new Date();
            jd += 0.5;
            z = Math.floor(jd);
            f = jd - z;

            if (z >= 2299161.0) {
              a = Math.floor((z - 1867216.25) / 36524.25);
              a = z + 1 + a - Math.floor(a / 4);
            } else {
              a = z;
            }

            b = a + 1524;
            c = Math.floor((b - 122.1) / 365.25);
            d = Math.floor(365.25 * c);
            e = Math.floor((b - d) / 30.6001);
            aux = b - d - Math.floor(30.6001 * e) + f;
            Calendar calendar = new GregorianCalendar();
            calendar.setTime(date);
            calendar.set(Calendar.DAY_OF_MONTH, (int) aux);

            double hhd= aux-calendar.get(Calendar.DAY_OF_MONTH);                
            aux = ((aux - calendar.get(Calendar.DAY_OF_MONTH)) * 24);




            calendar.set(Calendar.HOUR_OF_DAY, (int) aux);

            calendar.set(Calendar.MINUTE, (int) ((aux - calendar.get(Calendar.HOUR_OF_DAY)) * 60));



         // Calcul secondes 
            double mnd = (24 * hhd) - calendar.get(Calendar.HOUR_OF_DAY);
            double ssd = (60 * mnd) - calendar.get(Calendar.MINUTE); 
            int ss = (int)(60 * ssd);
            calendar.set(Calendar.SECOND,ss);



            if (e < 13.5) {
              m = e - 1;
            } else {
              m = e - 13;
            }
            // Se le resta uno al mes por el manejo de JAVA, donde los meses empiezan en 0.
            calendar.set(Calendar.MONTH, (int) m - 1);
            if (m > 2.5) {
              calendar.set(Calendar.YEAR, (int) (c - 4716));
            } else {
              calendar.set(Calendar.YEAR, (int) (c - 4715));
            }


        SimpleDateFormat sdf=new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        //System.out.println("Appnumber= "+appNumber+" TimeStamp="+timeStamp+" Julian Date="+julianDateStr+" Converted Date="+sdf.format(calendar.getTime()));
        return sdf.format(calendar.getTime());

}catch(Exception e){
    e.printStackTrace();
}
return null;

}  
2
répondu user912567 2017-05-23 12:17:53

j'ai lu tous les billets et quelque chose n'est pas très clair je pense.

user912567 a mentionné Jean Meeus, et il a absolument raison

la définition la plus précise que j'ai trouvée est donnée par Jean Meeus dans son livre "Astronomical Algorithms" (a must have, really...).

la Date Julienne est un date, exprimé comme d'habitude, avec une année, un mois et un jour.

Jour Julien est un (un nombre réel), à compter de l'année -4712 et de l'est "...continu nombre de jours..."(et fraction de jour). utile échelle de temps utilisée pour des calculs astronomiques précis.

Jean Meeus : "Le Jour Julien n'a rien à voir avec le calendrier Julien" ("Astronomical algorithms", 2ème Édition, p.59)

2
répondu bendeg 2016-02-27 08:31:01

tl;dr

LocalDate.now( ZoneId.of( “America/Montreal” ) ).getDayOfYear()

"jour Julien" terminologie

le terme "Julian day" est parfois utilisé de façon vague pour signifier le ordinal jour de l'année, ou date ordinale, ce qui signifie un nombre de 1 à 365 ou 366 (les années bissextiles). Le 1er janvier est 1, janvier 2 est 2, le 31 Décembre est 365 (ou 366 dans les années bissextiles).

Ce lâche (mauvaise) utilisation de Julian vient probablement de la utilisation en astronomie et autres zones de suivi des dates comme un nombre continu de jours depuis midi temps universel le 1er janvier, 4713 BCE (sur le calendrier Julien). Aujourd'hui, la date julienne approche les deux millions et demi,2,457,576 aujourd'hui.

java.temps

la java.le cadre de temps intégré dans Java 8 et plus fournit une facilité facile pour obtenir le jour de l'année.

LocalDate classe représente une date seule valeur sans Heure de la journée et sans fuseau horaire. Vous pouvez interroger pour le jour de l'année.

LocalDate localDate = LocalDate.of ( 2010 , Month.JUNE , 8 );
int dayOfYear = localDate.getDayOfYear ();

Dump à console. Les résultats montrent que le 8 juin 2010 est bien le jour # 159.

System.out.println ( "localDate: " + localDate + " | dayOfYear: " + dayOfYear );

localDate: 2010-06-08 | dayOfYear: 159

un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie autour du globe par zone. Par exemple, quelques minutes après minuit à Paris, La France est un nouveau jour alors qu'encore "hier" en Montréal Québec.

ZoneId z = ZoneId.of( “America/Montreal” );
LocalDate today = LocalDate.now( z );
int dayOfYear = today.getDayOfYear ();

aller dans l'autre direction, d'un numéro à un rendez-vous.

LocalDate ld = Year.of( 2017 ).atDay( 159 ) ;

java.temps

java.temps framework est intégré à Java 8 et plus tard. Ces classes supplantent le vieux gênant!--66-->héritage classes de date-heure telles que java.util.Date,Calendar,&SimpleDateFormat.

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

Pour en savoir plus, consultez le Tutorial Oracle. Et rechercher le débordement de la pile pour de nombreux exemples et explications. Spécification JSR 310.

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

Où obtenir le java.les classes de temps?

ThreeTen-Extra le projet étend java.temps avec des cours supplémentaires. Ce projet est un terrain d'essai pour de futurs possibles ajouts à java.temps. Vous pouvez trouver quelques classes utiles ici Interval,YearWeek,YearQuarter et plus.

1
répondu Basil Bourque 2018-04-10 03:56:29