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)
}