获取当前Julian日期并将其更改为Scala中的正常日期

时间:2016-09-26 09:21:49

标签: scala date apache-spark

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

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

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

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

所以......看看this article并决定你需要哪个版本的朱利安日。一旦你确定了Julian Date的版本,就很容易将它映射到Gregorian Calendar。

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

  1. 朱利安日期始于公元前4714年11月24日12:00,公历。
  2. 你应该注意到,朱利安日从中午开始,即。 12:00小时。
  3. 现在你可以像下面那样实现它,

    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日期 - 2456293.5208332013-01-01T00:30:00[GMT]

    现在,要么这篇文章将它近似为最接近的秒,或者由于两个日历之间的差异,我们的计算已经偏差0.0288秒。

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

答案 1 :(得分:0)

TL;博士

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

日间的年

我猜2016274表示一年和一年。在一年中,我指的是1月1日到12月31日的1-365或1-366。在这种情况下,2016年是2016年9月30日的2016年第二百八十四天。

有些人称一年的数字为“朱利安”,尽管在我看来这是对这些惊悚小说的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.DateCalendar和& SimpleDateFormat

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore