【问题标题】:Fetch the current Julian date and change it to normal date in Scala获取当前 Julian 日期并将其更改为 Scala 中的正常日期
【发布时间】:2017-03-01 14:42:24
【问题描述】:

我是使用 Spark 的 Scala 初学者。我有一个目录,其中包含 7 位 Julian 日期的文件(对于 09/30/2016-MM/DD/YYYY,它是 2016274)作为它们的名称(这些文件每小时到达此文件夹),应该转换为正常日期所以我可以检查一个特定的日期,决定我是否应该收集它。

我已成功从文件名中提取儒略日期,但未能将儒略日期更改为正常日期。

有人可以帮我吗?

【问题讨论】:

  • 你可以检查一下,它是基于Java的,但你仍然可以在Scala中包含这个代码stackoverflow.com/questions/3017954/…
  • @Siva 你所说的“朱利安日期”到底是什么意思?含义是超载的,不同的人使用不同的方式。请编辑您的问题以提供示例字符串的准确副本。
  • @Basil,我的意思是一个 7 位数的日期。但是,我编辑了我的问题。
  • @Siva 添加示例数据以及您如何解释该值的说明。解释一下朱利安日期是什么意思。这个词被不同的人使用和滥用。

标签: scala date apache-spark


【解决方案1】:

当您考虑与之相关的历史和改革时,朱利安日期成为一个复杂的概念。这就是使用 Java 提供的 Julian 日期实现的问题,因为我们不知道它实现了哪种变体,我们可能需要一些其他的 Julian Date 定义。

所以...查看this article 并决定您需要哪个版本的 Julian-Day。一旦确定了儒略日期的版本,就很容易将其映射为公历。

如果我们考虑最原始的朱利安日期,

  1. 儒略日开始于公历 4714 年 11 月 24 日 12:00。
  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 声称 Julian Date - 2456293.5208332013-01-01T00:30:00[GMT]

现在,要么本文将其近似为最接近的秒数,要么我们的计算因两个日历之间的差异而相差 0.0288 秒。

最后,您可以决定是添加一些四舍五入(如果需要)还是使用确切的值。

【讨论】:

    【解决方案2】:

    tl;博士

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

    一年中的某一天

    我猜2016274 表示一年和一年中的某一天。一年中的某一天是指 1-365 或 1-366 表示 1 月 1 日至 12 月 31 日。在本例中,是 2016 年的第 274 天,即 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-09-30

    试试这个code live at IdeOne.com


    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

    Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 2023-02-08
      相关资源
      最近更新 更多