Scala конвертирует значение DateTime в Timestamp - PullRequest
0 голосов
/ 21 ноября 2018

возможно, это дублированный вопрос, я попытался найти решение, но не смог.

Проблема: преобразовать экземпляр DateTime в Timestamp.

Мой экземпляр DateTime создан как:

    import org.joda.time.DateTime
    val start = (new DateTime).withYear(2016)
       .withMonthOfYear(12)
       .withDayOfMonth(1)
       .withMinuteOfHour(0)
       .withHourOfDay(0)

с печатью этой даты я получил:

2016-12-01T00:00:18.856+01:00

Что мне нужно, так это метка времени эпохи на картинке ниже: enter image description here

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Использование java.time.Помогает ли это?

scala> val x = java.time.LocalDateTime.ofEpochSecond(System.currentTimeMillis/1000,0,java.time.ZoneOffset.UTC)
x: java.time.LocalDateTime = 2018-11-21T18:41:29

scala> java.time.LocalDateTime.parse("2018-11-21T18:41:29.123").toEpochSecond(java.time.ZoneOffset.UTC)
res41: Long = 1542825689

scala> java.time.LocalDateTime.parse("2018-11-21T18:41:29.123").format(java.time.format.DateTimeFormatter.ofPattern("eeee, MMMM dd, yyyy hh:mm:ss a"))
res61: String = Wednesday, November 21, 2018 06:41:29 PM

scala>

Эта ссылка https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html может быть полезна для ознакомления с символами, используемыми в параметрах формата

0 голосов
/ 23 ноября 2018

ИМХО, один из самых быстрых способов вычислить метку времени Epoch:

scala> :paste
// Entering paste mode (ctrl-D to finish)

def epochDayForYear(year: Int): Long =
  365L * year + (((year + 3) >> 2) - (if (year < 0) {
    val century = year * 1374389535L >> 37 // divide int by 100 (a sign correction is not required)
    century - (century >> 2)
  } else ((year + 99) * 1374389535L >> 37) - ((year + 399) * 1374389535L >> 39))) // divide int by 100 and by 400 accordingly (a sign correction is not required)

def dayOfYearForYearMonth(year: Int, month: Int): Int =
  ((month * 1050835331877L - 1036518774222L) >> 35).toInt - // == (367 * month - 362) / 12
    (if (month <= 2) 0
    else if (isLeap(year)) 1
    else 2)

def isLeap(year: Int): Boolean = (year & 3) == 0 && {
  val century = (year * 1374389535L >> 37).toInt - (year >> 31) // divide int by 100
  century * 100 != year || (century & 3) == 0
}

def secondOfDay(hour: Int, month: Int, day: Int): Int = 
  hour * 3600 + month * 60 + day

val (year, month, day, hour, minute, second, timeZoneOffsetHour, timeZoneOffsetMinute) = 
  (2016, 12, 1, 0, 0, 2, 0, 0)

val epochSecond = 
  (epochDayForYear(year) + (dayOfYearForYearMonth(year, month) + day - 719529)) * 86400 + 
  secondOfDay(hour + timeZoneOffsetHour, minute + timeZoneOffsetMinute, second) // where 719528 is days 0000 to 1970

// Exiting paste mode, now interpreting.

epochDayForYear: (year: Int)Long
dayOfYearForYearMonth: (year: Int, month: Int)Int
isLeap: (year: Int)Boolean
secondOfDay: (hour: Int, month: Int, day: Int)Int
year: Int = 2016
month: Int = 12
day: Int = 1
hour: Int = 0
minute: Int = 0
second: Int = 2
timeZoneOffsetHour: Int = 0
timeZoneOffsetMinute: Int = 0
epochSecond: Long = 1480550402          

Кстати, большая часть этого кода заимствована из проекта jsoniter-scala .

0 голосов
/ 21 ноября 2018

Первое: Scala компилируется в Java, поэтому, когда вы задаете вопрос о библиотеке Java, вы можете использовать примеры из этого.

Второе: есть ли у вас часовой пояс по умолчанию в вашем приложении?Я бы поставил это в логическое место (т.е. когда вы запускаете ваше приложение / в каком-то конфиге)

DateTimeZone.setDefault(DateTimeZone.UTC);

Теперь вы можете просто создать новый java.sql.Timestamp, например:

import java.sql.Timestamp;
import java.time.Instant

  val start = (new DateTime).withYear(2016)
   .withMonthOfYear(12)
   .withDayOfMonth(1)
   .withMinuteOfHour(0)
   .withHourOfDay(0)

  val timestamp = new Timestamp(start.getMillis()) : Timestamp

  // To get the epoch timestamp, take a look at java.time.Instant

  val epochTimestamp =  timestamp.toInstant() : Instant

Больше информации здесь: https://www.jeejava.com/conversion-of-joda-date-time-to-sql-timestamp-and-vice-versa/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...