Kotlin конвертировать TimeStamp в DateTime

Я пытаюсь выяснить, как я могу конвертировать timestamp в datetime в Kotlin это очень просто в Java, но я не могу найти какой-либо эквивалент в kotlin,

Например: метка времени эпохи (секунд с 1070-01-01) 1510500494 ==> Объект DateTime 2017-11-12 03:28:14,

Есть ли какое-то решение для этого в kotlin или я должен использовать синтаксис Java в kotlin? Пожалуйста, дайте мне простой пример, чтобы показать, как я могу решить эту проблему. Заранее спасибо.

эта ссылка не является ответом на мой вопрос

13 ответов

private fun getDateTime(s: String): String? {
    try {
        val sdf = SimpleDateFormat("MM/dd/yyyy")
        val netDate = Date(Long.parseLong(s))
        return sdf.format(netDate)
    } catch (e: Exception) {
        return e.toString()
    }
}

Это на самом деле так же, как Java. Попробуй это:

val stamp = Timestamp(System.currentTimeMillis())
val date = Date(stamp.getTime())
println(date)
class DateTest {

    private val simpleDateFormat = SimpleDateFormat("dd MMMM yyyy, HH:mm:ss", Locale.ENGLISH)

    @Test
    fun testDate() {
        val time = 1560507488
        println(getDateString(time)) // 14 June 2019, 13:18:08
    }

    private fun getDateString(time: Long) : String = simpleDateFormat.format(time * 1000L)

    private fun getDateString(time: Int) : String = simpleDateFormat.format(time * 1000L)

}

Обратите внимание, что мы умножаем на 1000L, а не на 1000. Если у вас есть целое число (1560507488), умноженное на 1000, вы получите неправильный результат: 17 января 1970 г., 17:25:59.

Хотя это Kotlin, вы все равно должны использовать Java API. Пример преобразования API в API Java 8+ 1510500494 который вы упомянули в комментариях к вопросу:

import java.time.*

val dt = Instant.ofEpochSecond(1510500494).atZone(ZoneId.systemDefault()).toLocalDateTime()

Вот решение в Котлине

fun getShortDate(ts:Long?):String{
    if(ts == null) return ""
    //Get instance of calendar
    val calendar = Calendar.getInstance(Locale.getDefault())
    //get current date from ts
    calendar.timeInMillis = ts
    //return formatted date 
    return android.text.format.DateFormat.format("E, dd MMM yyyy", calendar).toString()
}
val sdf = SimpleDateFormat("dd/MM/yy hh:mm a") 
val netDate = Date(item.timestamp) 
val date =sdf.format(netDate)

Log.e("Tag","Formatted Date"+date)

"sdf" - это переменная "SimpleDateFormat", в которой мы можем установить формат даты по своему усмотрению.

netDate - это переменная Date. В Date мы можем отправлять значения временной метки и печатать эту дату с помощью SimpleDateFormat, используя sdf.format(netDate).

Это сработало для меня - занимает много

    import java.time.*

    private fun getDateTimeFromEpocLongOfSeconds(epoc: Long): String? {
        try {
            val netDate = Date(epoc*1000)
            return netDate.toString()
        } catch (e: Exception) {
            return e.toString()
        }
   }
      @SuppressLint("SimpleDateFormat")
fun dateFormatter(milliseconds: String): String {
    return SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(Date(milliseconds.toLong())).toString()
}

Это улучшенная версия существующих ответов ( Сахила и Хавьера ) .

      val stamp = Timestamp(System.currentTimeMillis()) // from java.sql.timestamp
val date = Date(stamp.time)

val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
sdf.timeZone = TimeZone.getTimeZone("Asia/Kolkata") // set your timezone appropriately

val formattedDate = sdf.format(date)

println(formattedDate)

Ссылка на игровую площадку Kotlin

Улучшения

  • Установите часовой пояс, чтобы получить правильное время, в противном случае вы получите время UTC.
  • Отформатировано время даты в соответствии с yyyy-MM-dd HH:mm:ssформат.
  • Устранить неоднозначность Timestampимпорт класса, комментируя требуемый импорт.
  • Добавлена ​​ссылка на Kotlin Playground, чтобы увидеть рабочий пример.
      private fun epochToIso8601(time: Long): String {
    val format = "dd MMM yyyy HH:mm:ss" // you can add the format you need
    val sdf = SimpleDateFormat(format, Locale.getDefault()) // default local
    sdf.timeZone = TimeZone.getDefault() // set anytime zone you need
    return sdf.format(Date(time * 1000))
}

Приведенный выше код получит время в длинном формате, который является форматом эпохи по умолчанию, и вернет его в виде строки для отображения.

Если у вас есть ввод в виде строки, просто добавьте .toLong(), и он будет преобразован в длинный.

  fun stringtoDate(dates: String): Date {
        val sdf = SimpleDateFormat("EEE, MMM dd yyyy",
                Locale.ENGLISH)
        var date: Date? = null
        try {
             date = sdf.parse(dates)
            println(date)
        } catch (e: ParseException) {
            e.printStackTrace()
        }
        return date!!
    }

Если вы пытаетесь преобразовать метку времени из файла firebase. Это то, что у меня сработало.

val timestamp = data[TIMESTAMP] as com.google.firebase.Timestamp
val date = timestamp.toDate()

У меня это работает.

       fun FromTimestamp(value: Long?): Date? {
        return if (value == null) null else Date(value)
    }
Другие вопросы по тегам