Дата по местному времени kotlin - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть объект даты с

"Вс 26 апреля 11:44:00 GMT + 03: 00 2020"

Я пытался отформатировать его, но оно всегда будет игнорировать часовой пояс "+3: 00" и показывать час, не меняя его

что я пробовал:

   val sdf = SimpleDateFormat("dd MM yyyy HH:mm:ss", Locale.US)
    return sdf.format(this)

Ответы [ 3 ]

5 голосов
/ 29 апреля 2020

Я не совсем понимаю ваш вопрос, но, думаю, вы имели в виду, что вам нужен DateTime, связанный с определенной зоной. В kotlin у нас есть ZonedDateTime класс

import java.time.ZoneId
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.time.format.FormatStyle

val londonZone = ZoneId.of("Europe/London")
val londonCurrentDateTime = ZonedDateTime.now(londonZone)
println(londonCurrentDateTime) // Output:  2018-01-25T07:41:02.296Z[Europe/London]
val londonDateAndTime = londonCurrentDateTime.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM))
println(londonDateAndTime) // Output: Thursday, January 25, 2018 7:40:34 AM

Вам также может понадобиться взглянуть на LocalDateTime класс.

2 голосов
/ 29 апреля 2020

Если вы просто хотите проанализировать дату и время String с данным шаблоном, а затем преобразовать результат в другое смещение, вы можете go сделать так:

fun main() {
    // provide the source String
    val datetime = "Sun Apr 26 11:44:00 GMT+03:00 2020"
    // provide a pattern for parsing
    val parsePattern = "E MMM dd HH:mm:ss O yyyy";
    // parse the String to an OffsetDateTime
    val parsedOffsetDateTime = java.time.OffsetDateTime.parse(
                                datetime,
                                java.time.format.DateTimeFormatter.ofPattern(parsePattern))
    // print the result using the default format
    println(parsedOffsetDateTime)

    // then get the same moment in time at a different offset
    val adjustedOffsetDateTime = parsedOffsetDateTime.withOffsetSameInstant(
                                    java.time.ZoneOffset.of("+02:00"))
    // and print that, too, in order to see the difference
    println(adjustedOffsetDateTime)
}

, который производит вывод

2020-04-26T11:44+03:00
2020-04-26T10:44+02:00
1 голос
/ 29 апреля 2020

Строка формата зависит от того, какую SimpleDateFormat вы используете:

  • При использовании java.text.SimpleDateFormat с API уровня 24+ строка формата должна быть :
    "EEE MMM d HH:mm:ss 'GMT'XXX yyyy"

  • При использовании android.icu.text.SimpleDateFormat строка формата должна быть:
    "EEE MMM d HH:mm:ss OOOO yyyy".

Демонстрация (простым Java)

TimeZone.setDefault(TimeZone.getTimeZone("Asia/Jerusalem"));

Date date = new Date(1587890640000L); // date object with "Sun Apr 26 11:44:00 GMT+03:00 2020"

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss 'GMT'XXX yyyy", Locale.US);
String dateString = sdf.format(date);
System.out.println("Formatted  : " + dateString);

Date parsed = sdf.parse(dateString);
System.out.println("Parsed back: " + parsed);
System.out.println("Millis since Epoch: " + parsed.getTime());

Выход

Formatted  : Sun Apr 26 11:44:00 GMT+03:00 2020
Parsed back: Sun Apr 26 11:44:00 IDT 2020
Millis since Epoch: 1587890640000
...