2010-06-09 13 views
14

मैंने http://www.rgagnon.com/javadetails/java-0506.html पर "समाधान" देखा है, लेकिन यह सही ढंग से काम नहीं करता है। जैसे कल (8 जून) 15 9 होना चाहिए था, लेकिन यह कहा गया था कि यह 245 था।जावा में वर्ष के जूलियन दिन

तो, क्या किसी के पास जावा में वर्तमान दिनांक के तीन अंक जूलियन दिन (जूलियन तिथि नहीं - मुझे इस वर्ष की आवश्यकता है))?

धन्यवाद! मार्क

+0

अरे मार्क, मैं भी इस जानना चाहते हैं, क्योंकि मैं एक astronomie कार्यक्रम मैं पर काम कर रहा हूँ में इसका उपयोग करना चाहते हैं और मैं सीधे जावा में और नहीं इसे अपने आप को कोडिंग करने के लिए पसंद करते हैं :) –

+1

इस दिन-वर्ष (1-366) को [* साधारण दिनांक *] (https://en.wikipedia.org/wiki/Ordinal_date) के रूप में जाना जाता है। "जूलियन" का उपयोग आम है, लेकिन जहां तक ​​मुझे पता है, गलत है। स्पष्ट रूप से [* जूलियन डे *] (https://en.wikipedia.org/wiki/Julian_day) के साथ एक उलझन जो जूलियन दिवस के साथ दोपहर सार्वभौमिक समय से शुरू होने वाले जूलियन दिवस की गिनती में पूरे सौर दिन को सौंपा गया पूर्णांक है नंबर 1 को 1 जनवरी, 4713 ईसा पूर्व दोपहर से शुरू होने वाले दिन को निर्दिष्ट किया गया, प्रख्यात जूलियन कैलेंडर (24 नवंबर, 4714 ईसा पूर्व, प्रामाणिक ग्रेगोरियन कैलेंडर में)। पूर्व: 2000-01-01T12: 00: 00Z = 2,451,545। –

उत्तर

5

यदि आप चाहते हैं कि साल का साल हो, तो आप ग्रेगोरियन कैलेंडर्स DAY_OF_YEAR फ़ील्ड का उपयोग क्यों नहीं करते?

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)); 
} 

}

वैकल्पिक रूप से, आप आज के जूलियन तिथि और इस वर्ष की 1 जनवरी के बीच अंतर यह है कि गणना कर सकते हैं। लेकिन परिणाम के लिए 1 जोड़ने के लिए, के बाद से जनवरी 1 वर्ष की zeroth दिन नहीं है सुनिश्चित करें:

int[] now = {2010, 6, 8}; 
int[] janFirst = {2010, 1, 1}; 
double dayOfYear = toJulian(now) - toJulian(janFirst) + 1 
System.out.println(Double.valueOf(dayOfYear).intValue()); 
+0

बहुत बहुत धन्यवाद! यह पूरी तरह से काम करता था - मुझे पता था कि एक साधारण जवाब होना था। – Mark

5
import java.util.Calendar; 
// ... 
final int julianDay = Calendar.getInstance().get(Calendar.DAY_OF_YEAR); 

ध्यान दें कि इस खाते में नहीं ले करता है सौदा है कि अजीब साइट पर आप संदर्भित द्वारा दावा "दोपहर में शुरू होता है"। यह निश्चित रूप से पाठ्यक्रम के समय की जांच करके तय किया जा सकता है।

+0

मेरे सिस्टम 'System.out.println (कैलेंडर.getInstance()। GetClass()); 'प्रिंट्स क्लास java.util.Gregorian कैलेंडर' लेकिन शायद यह जूलियन जैसा ही है। – aioobe

+2

"जूलियन डेट" या "जूलियन डे" हमेशा मेरे लिए साल के दिन का मतलब रहा है। मुझे लगता है कि शायद गंभीर शास्त्रीय विद्वानों को छोड़कर सभी के लिए यह सच है। अगर कोई पूर्व-ग्रेगोरियन कैलेंडर द्वारा गणना की गई तारीख की तलाश में है, तो मेरा समाधान काम नहीं करेगा। ध्यान दें कि प्रश्न में वाक्य शामिल है, "मुझे इस साल का दिन चाहिए।" – Pointy

+0

गणना करने से पहले 'setGregorianChange (नई तिथि (Long.MAX_VALUE)) '। फिर यह एक 'जूलियन' दिन होगा। –

2

अगर हम इस तरह के chordiant निर्णय प्रबंधक के रूप में एक डबल जूलियन तारीख मिल

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

निम्नलिखित काम कर रहा है लेकिन दूसरे How can I convert between a Java Date and Julian day number?

सार्वजनिक स्थैतिक स्ट्रिंग julianDate (स्ट्रिंग julianDateStr) {

012 की देखभाल नहीं लिया जाता है
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; 

} 
8
DateFormat d = new SimpleDateFormat("D"); 
System.out.println(d.format(date)); 
2

मैंने सभी पदों को पढ़ लिया है और मुझे लगता है कि कुछ स्पष्ट नहीं है।

user912567 जीन मीयस mentionned, और वह पूरी तरह से ठीक है

सबसे सटीक परिभाषा मैंने पाया अपने 'खगोलीय एल्गोरिदम "पुस्तक में जीन मीयस द्वारा दिया जाता है (एक बहुत होना आवश्यक है, ...)।

जूलियन दिनांक दिनांक है, जो सामान्य रूप से एक वर्ष, एक महीने और एक दिन के साथ व्यक्त किया जाता है।

जूलियन डे संख्या (वास्तविक संख्या) है, जो वर्ष -4712 से गिना जाता है और "... दिनों की निरंतर गणना ..." (और दिन का अंश) है। ए उपयोगी सटीक खगोलीय गणना के लिए उपयोग किए जाने वाले समय पैमाने।

जीन मीस: "जूलियन डे के पास जूलियन कैलेंडर से कोई लेना देना नहीं है" ("खगोलीय एल्गोरिदम", दूसरा संस्करण, पृ।59)

+0

बिल्कुल ऐसा ही। यह ध्यान देने योग्य है कि यहां कई उत्तरों और टिप्पणियों के विपरीत जूलियन दिवस आधुनिक कंप्यूटिंग में उपयोगी रहता है, क्योंकि आप बहुत कम प्रयास के साथ दिनों में * अंतर * की गणना कर सकते हैं। – EJP

1

tl; डॉ

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

"जूलियन दिन" शब्दावली

शब्द "जूलियन दिन" कभी कभी शिथिल प्रयोग किया जाता है इस वर्ष के ordinal दिन, या Ordinal date मतलब करने के लिए, एक नंबर अर्थ 1 से 365 या 366 (leap years) से। 1 जनवरी 1 है, 2 जनवरी 2 है, 31 दिसंबर 365 (या 366 लीप वर्षों में) है।

Julian के इस ढीले (गलत) उपयोग शायद use in astronomy और 1 जनवरी को दोपहर यूनिवर्सल समय बाद के दिनों की एक सतत गिनती के रूप में दिनांक पर नज़र रखने के अन्य क्षेत्रों से आता है, 4713 ईसा पूर्व (Julian calendar पर)। आजकल जूलियन की तारीख आज ढाई मिलियन, 2,457,576 तक पहुंच रही है।

java.time

java.time जावा 8 में बनाया गया और बाद में ढांचे के दिन के अनुसार साल तक पहुंचने का आसान सुविधा प्रदान करता है।

LocalDate कक्षा समय-समय पर और समय क्षेत्र के बिना दिनांक-केवल मूल्य का प्रतिनिधित्व करती है। आप दिन के लिए पूछताछ कर सकते हैं।

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

कंसोल पर डंप करें। परिणाम बताते हैं कि जून 8, 2010 वास्तव में दिन # 159

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

LOCALDATE है: 2010-06-08 | दिनऑफियर: 15 9

एक तिथि निर्धारित करने में एक समय क्षेत्र महत्वपूर्ण है। किसी भी क्षण के लिए, तिथि ज़ोन द्वारा दुनिया भर में बदलती है। उदाहरण के लिए, पेरिस फ्रांस में मध्यरात्रि के कुछ मिनट बाद एक नया दिन है जबकि मॉन्ट्रियल क्यूबेक में अभी भी "कल" ​​है।

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

दूसरी दिशा में, किसी संख्या से लेकर किसी तारीख तक जा रहा है।

LocalDate ld = Year.of(2017).atDay(159) ; 
संबंधित मुद्दे