2016-09-26 4 views
1

私はSparkで作業しているScalaの初心者です。私は7桁のユリウス暦の日付(09/30/2016-MM/DD/YYYY、それは2016274)のファイル名のディレクトリを持っています(これらは毎時このフォルダに到着します)。私は特定の日付で確認することができます、私はそれを収集するかどうかを決定します。スカラで現在のユリウス暦の日付を取得し、それを通常の日付に変更します

私はファイル名からユリウス暦の日付を引くことに成功しましたが、ユリウス暦の日付を通常の日付に変更できませんでした。

誰かが私を助けてくれますか?

+0

これはJavaに基づいていますが、このコードをScalaに含めることもできます。http://stackoverflow.com/questions/3017954/convert-a-julian-date-to-regular-calendar-date – Shankar

+0

@Siva「ユリウス暦」とはどういう意味ですか?意味は過負荷で、異なる人々によって異なって使用されます。あなたの質問を編集して、例文列の正確なコピーを提供してください。 –

+0

@Basil、私は7桁の日付を意味しました。私はしかし、私の質問を編集しました。 – Siva

答えて

0

ジュリアン・デイトは、それに関連する歴史と改革を考慮すると複雑な概念になります。これは、Javaで提供されているJulianの日付実装を使用する場合の問題です。これは、実装されているバリエーションがわからないため、Julian Dateの他の定義が必要な場合があります。

だから、this articleを見て、あなたが必要とするジュリアン・デーのバージョンを決めてください。 Julian Dateのバージョンを決定したら、それをGregorian Calendarにマップするのはかなり簡単です。

  1. ユリウス日は、午前12時に始まり、我々は最も独創ユリウス日を考えると

    、11月24日、グレゴリオ暦の4714 BC。

  2. あなたが気づいたはずのユリウスの日は正午に始まります。 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; DR

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

デイ・オブ・イヤー

私は2016274年と日の年を意味することを推測しています。 1月1日から12月31日までの日数は、1〜365日または1〜366日を意味します。この場合、2016年の236日、2016年9月30日です。

一部人は年中行事の番号「ジュリアン」を呼んでいますが、これは私にはastonomersの誤解であると思われます。Julian Day

スカラの構文がわかりません。しかし、Javaプラットフォームに組み込まれたjava.timeクラスを使用するためのJava構文を示すことができます。

DateTimeFormatterクラスは、書式設定パターンで年末年始としてDを定義します。 1つまたは2つの数字の数字の先頭に0をつけるために、三重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.DateCalendar、& SimpleDateFormatに取って代わります。

maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8SE 9以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
      ThreeTenABP
    • プロジェクトは、具体的にはAndroid用(上記)ThreeTen-バックポートを適応させます。
    • How to use ThreeTenABP…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

関連する問題