2009-01-21 13 views
16

में कनवर्ट करें मैं एक यूनिक्स टाइमस्टैम्प (1232559922 कहें) से एक आंशिक जूलियन दिनांक (2454853.03150) में कैसे परिवर्तित कर सकता हूं।यूनिक्स टाइमस्टैम्प को जूलियन

मुझे एक वेबसाइट मिली (http://aa.usno.navy.mil/data/docs/JulianDate.php) जो एक समान गणना करता है लेकिन मुझे इसे प्रोग्रामिक रूप से करने की आवश्यकता है।

समाधान C/C++, अजगर, पर्ल, बैश, आदि में हो सकता है ...

उत्तर

26

यूनिक्स काल (शून्य बिंदु) 1 जनवरी, 1970 जीएमटी है। यही कारण है कि 2440587,5

तो की जूलियन दिन से मेल खाती है, छद्म कोड में:

function float getJulianFromUnix(int unixSecs) 
{ 
    return (unixSecs/86400.0) + 2440587.5; 
} 
+10

आप अंत में .5 भूल गया। जोड़ा गया स्थिरता 2440587.5 –

+0

होना चाहिए मैं समझ नहीं पा रहा हूं कि 86400.0 क्या है? और परिणाम वर्तमान समयरेखा से बहुत दूर है। – eapo

+0

86400 सेकंड से सेकंड का कारक है (1 दिन = 24 घंटे/दिन x 60 मिनट/घंटा x 60 सेकेंड/मिनट) – TNgo

6

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैं सिर्फ इतना कहना होगा ...

जवाब जेसन कोहेन द्वारा दिए गए रूपांतरण का एक अच्छा अनुमान है।

एक समस्या है हालांकि यह एक दिन में सेकंड की संख्या से संबंधित है। एक दिन -8.800 सेकेंड लंबा नहीं है, और विभिन्न अवलोकन मानकों के साथ समय सिंक्रनाइज़ करने के लिए समय-समय पर सेकेंड जोड़े जाते हैं। इन्हें लीप सेकेंड कहा जाता है (https://en.wikipedia.org/wiki/Leap_second)। UT1 के 1 सेकंड के भीतर रखने के लिए यूएटीसी में लीप सेकंड जोड़े जाते हैं।

यह कारण है कि 1 जनवरी, 1 9 70 से अधिक से अधिक समय बीत चुका है, ऊपर दिया गया सरल रूपांतरण "वास्तविक अवलोकन योग्य समय" से अधिक से अधिक त्रुटि प्राप्त करेगा। 1 9 72 और 2013 के बीच 25 लीप सेकंड जोड़े गए थे।

जूलियन दिवस संख्या की सुंदरता और सादगी का हिस्सा यह है कि वे तारीख तारों का प्रतिनिधित्व नहीं करते हैं। जूलियन युग की शुरुआत के बाद से वे विलुप्त समय की गिनती हैं, जो पॉज़िक्स समय की तरह पॉज़िक्स युग के बाद से मिलीसेकंड की निरंतर गिनती है। तब मौजूद एकमात्र समस्या तब होती है जब आप जूलियन डे नंबर को स्थानीयकृत दिनांक स्ट्रिंग में मैप करने का प्रयास करते हैं।

यदि आपको एक तिथि स्ट्रिंग की आवश्यकता है जो एक मिनट (2013 में) के भीतर सटीक है, तो आपको एक एल्गोरिदम की आवश्यकता होगी जो लीप सेकेंड के लिए खाता हो।

+8

मुझे लगता है कि यूनिक्स/पॉज़िक्स समय लीप सेकेंड को अनदेखा करता है, इसलिए जेसन कोहेन का एल्गोरिदम नहीं होगा क्योंकि लीप सेकेंड जमा हो जाएंगे । Http://en.wikipedia.org/wiki/Unix_time#Leap_seconds देखें। अगर मैं चीजों को गलत समझ रहा हूं, तो कृपया मुझे सीधे सेट करें। –

0

यूनिक्स टाइमस्टैम्प जूलियन में कनवर्ट करने के लिए मेरा जावास्क्रिप्ट कोड है। मूल रूप से वर्तमान दिनांक और समय दिखा रहा है, लेकिन एक छोटे से आधुनिक के साथ अपने सवाल का जवाब है:

function computeJulianDate(DD,MM,YY,HR,MN,SC) { 
    with (Math) { 
     HR = HR + (MN/60) + (SC/3600); 
     GGG = 1; 
     if (YY <= 1585) GGG = 0; 
     JD = -1 * floor(7 * (floor((MM + 9)/12) + YY)/4); 
     S = 1; 
     if ((MM - 9)<0) S=-1; 
     A = abs(MM - 9); 
     J1 = floor(YY + S * floor(A/7)); 
     J1 = -1 * floor((floor(J1/100) + 1) * 3/4); 
     JD = JD + floor(275 * MM/9) + DD + (GGG * J1); 
     JD = JD + 1721027 + 2 * GGG + 367 * YY - 0.5; 
     JD = JD + (HR/24); 
    } 
    return JD; 
} 
function getUTCDateTimeOrJD(now,jd=0) { 
    var hours = now.getUTCHours(); 
    var minutes = now.getUTCMinutes(); 
    var seconds = now.getUTCSeconds() 
    var month = now.getUTCMonth() + 1; 
    var day = now.getUTCDate(); 
    var year = now.getUTCFullYear(); 
    if (jd==1) 
     return computeJulianDate(month, day, year, hours, minutes, seconds); 
    else 
     return day+". "+month+". "+year+". "+hours+":"+minutes+":"+seconds; 
} 

var unixTime = 1473294606; 

    getUTCDateTimeOrJD(new Date(unixTime*1000)); 
    getUTCDateTimeOrJD(new Date(unixTime*1000),1); 

Working JSFiddle example here

संबंधित मुद्दे