2016-09-26 41 views
1

我是Scala上的Spark初學者。我有一個帶有7位儒略日期(09/30/2016-MM/DD/YYYY,它是2016274)的文件目錄作爲他們的名字(每小時到達這個文件夾),它應該被轉換爲正常日期我可以檢查一個特定的日期,決定是否應該收集它。獲取當前Julian日期並將其更改爲Scala中的正常日期

我已成功從文件的名稱中提取Julian日期,但未能將Julian日期更改爲正常日期。

有人可以幫我在這裏嗎?

+0

你可以檢查它,它是基於Java,但你仍然可以在Scala中包含此代碼http://stackoverflow.com/questions/3017954/convert-a-julian-date-to-regular-calendar-date – Shankar

+0

@Siva「Julian date」的意思是什麼?意義超載,不同人使用不同。請編輯您的問題以提供示例字符串的精確副本。 –

+0

@Basil,我的意思是一個7位數的日期。然而,我編輯了我的問題。 – Siva

回答

0

朱利安日期成爲一個複雜的概念,當你考慮與之相關的歷史和改革。這就是使用Java提供的Julian日期實現的問題,因爲我們不知道它實現了哪種變體,我們可能需要Julian Date的其他定義。

所以...看看this article並決定您需要哪個版本的Julian-Day。一旦你決定了你的朱利安日期版本,它很容易繪製公曆日曆。

如果我們考慮到最原始的儒略曆,

  1. 儒略日的12:00至開始,11月24日,BC 4714陽曆的。正如你應該注意到的那樣,朱利安節開始於中午即。 12:00小時

現在你可以實現像下面,

import java.time.{ZonedDateTime, LocalDateTime} 

def julianDateToZonedDateTime(julianDate: Double): ZonedDateTime = { 
    val julianDayNumber = math.floor(julianDate).toLong 
    val julianDayFraction = julianDate - julianDayNumber 
    val julianDayFractionToNanoSeconds = math.floor(julianDayFraction * 24 * 60 * 60 * math.pow(10, 9)).toLong 

    val bcEraDateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:z:G") 
    val julianDateStartDate = ZonedDateTime.parse("4714-11-24 12:00:00:GMT:BC", bcEraDateFormat) 

    val zonedDateTime = julianDateStartDate.plusDays(julianDayNumber).plusNanos(julianDayFractionToNanoSeconds) 

    zonedDateTime 
} 

val yourJulianDate: Double = 2456293.520833 

val zonedDateTime = julianDateToZonedDateTime(yourJulianDate) 
// 2013-01-01T00:29:59.971206486Z[GMT] 

This Wikipedia article索賠儒略日 - 2456293.5208332013-01-01T00:30:00[GMT]

現在,無論這篇文章是否近似於最接近的秒數,還是由於兩個日曆之間的差異,我們的計算已經偏離了0.0288秒。

最後,您可以決定是否添加一些舍入(如果需要)或使用確切的值。

0

TL;博士

LocalDate.parse( 
    "2016274" , 
    DateTimeFormatter.ofPattern("uuuuDDD") 
) 

日的年中

我猜測2016274意味着一年中某一天的一年。我的意思是指1月1日到12月31日的1-365或1-366。在這種情況下,2016年的第二百七十四天即2016年9月30日。

一些人們稱之爲「朱連」,儘管這在我看來是誤解了人們的想象「Julian Day」。

我不知道Scala語法。但是,我可以向您展示使用Java平臺中構建的java.time類的Java語法。

DateTimeFormatter類定義D在格式模式下的日曆年。我將使用三聯DDD填充前一位數字的一位或兩位數字。

String input = "2016274" ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuuDDD"); 
LocalDate ld = LocalDate.parse(input , f); 

2016年9月30日

試試這個code live at IdeOne.com


關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore

相關問題