Android Формат даты с часовым поясом

Мне нужно отформатировать дату в конкретной строке.

я использовал SimpleDateFormat класс для форматирования даты с использованием шаблона yyyy-MM-dd'T'HH:mm:ssZ "возвращает текущую дату как
" 2013-01-04T15:51:45+0530 но мне нужно как
" 2013-01-04T15:51:45+05:30 ".

Ниже приведено кодирование,

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);      
Log.e(C.TAG, "formatted string: "+sdf.format(c.getTime()));

Вывод: отформатированная строка: 2013-01-04T15:51:45+0530

Мне нужен формат как 2013-01-04T15:51:45+05:30 просто добавив двоеточие в промежутке времени.

Поскольку я работаю над календарем Google, чтобы вставить событие, он принимает только тот формат, который я упомянул.

10 ответов

Решение

Вместо этого вы можете использовать Joda Time. это DateTimeFormat имеет ZZ Атрибут формата, который делает то, что вы хотите.

Ссылка на сайт

Большое преимущество: в отличие SimpleDateFormat, DateTimeFormatter Поток безопасен. Использование:

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ")
    .withLocale(Locale.ENGLISH);

Вы также можете использовать "ZZZZZ" вместо "Z" в вашем шаблоне (согласно документации). Что-то вроде этого

    Calendar c = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ", Locale.ENGLISH);      
    Log.e(C.TAG, "formatted string: "+sdf.format(c.getTime()));

тл;др

Вы можете использовать шаблон, yyyy-MM-dd'T'HH:mm:ssXXXдля желаемого результата.

Java.время

API даты и времени java.utilи их API форматирования устарели и подвержены ошибкам. Рекомендуется полностью отказаться от их использования и перейти на современный API даты и времени .

Использование современного API даты и времени:

Создание объекта, который содержит информацию о смещении даты, времени и часового пояса, и его форматирование:

      import java.time.LocalDate;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        OffsetDateTime odt = OffsetDateTime.of(LocalDate.of(2013, 1, 4), LocalTime.of(15, 51, 45),
                ZoneOffset.ofHoursMinutes(5, 30));

        // Print the default format i.e. the string returned by OffsetDateTime#toString
        System.out.println(odt);

        // Custom format
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
        System.out.println(dtf.format(odt));
    }
}

Выход:


Как вы можете заметить, выходные данные для формата по умолчанию и для формата, использующего a, одинаковы. Однако здесь есть одна загвоздка: реализацияOffsetDateTime#toString опускает секунду и долю секунды, если они 0т.е. если время в приведенном выше коде равно LocalTime.of(15, 0, 0), вывод для формата по умолчанию будет 2013-01-04T15:00+05:30. Если вам нужна строка типа 2013-01-04T15:00:00+05:30за это время вам придется использовать DateTimeFormatterс желаемым узором.

Разбор и форматирование:

      import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtfForInputString = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);
        OffsetDateTime odt = OffsetDateTime.parse("2013-01-04T15:51:45+0530", dtfForInputString);

        // Print the default format i.e. the string returned by OffsetDateTime#toString
        System.out.println(odt);

        // Custom format
        DateTimeFormatter dtfCustomOutput = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
        System.out.println(dtfCustomOutput.format(odt));
    }
}

Выход:

      2013-01-04T15:51:45+05:30
2013-01-04T15:51:45+05:30

Использование устаревшего API:

Создание объекта даты и времени для заданного смещения часового пояса и его форматирование:

      import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+05:30"));
        calendar.set(2013, 0, 4, 15, 51, 45);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+05:30"));
        Date date = calendar.getTime();
        System.out.println(sdf.format(date));
    }
}

Выход:


The Calendarкласс использует (или GMT) в качестве часового пояса по умолчанию, и поэтому, если вы не укажете часовой пояс вместе с ним, он вернет java.util.Dateобъект для .

Точно так же SimpleDateFormatкласс также использует часовой пояс по умолчанию, и поэтому, если вы не укажете часовой пояс вместе с ним, он вернет отформатированный Stringдля соответствующей даты-времени в UTC.

Разбор и форматирование:

      import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdfForInputString = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);
        Date date = sdfForInputString.parse("2013-01-04T15:51:45+0530");

        SimpleDateFormat sdfCustomOutput = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
        sdfCustomOutput.setTimeZone(TimeZone.getTimeZone("GMT+05:30"));
        System.out.println(sdfCustomOutput.format(date));
    }
}

Выход:

      2013-01-04T15:51:45+05:30

Почему бы просто не сделать это вручную с помощью регулярного выражения?

String oldDate = "2013-01-04T15:51:45+0530";
String newDate = oldDate.replaceAll("(\\+\\d\\d)(\\d\\d)", "$1:$2");

Тот же результат, с подстрокой (если производительность является проблемой).

String oldDate = "2013-01-04T15:51:45+0530";
int length = oldDate.length();
String newDate = oldDate.substring(0, length - 2) + ':' + oldDate.substring(length - 2);

Что вы можете сделать, это просто добавить ":" вручную, используя substring(). Я сталкивался с этим ранее, и это решение работает.

Попробуй это

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);   

System.out.println("formatted string: "+sdf.format(c.getTime()));

String text = sdf.format(c.getTime());  
String result = text.substring(0, 22) + ":" + text.substring(22);  
System.out.println("result = " + result);

Если вы хотите дату для другого часового пояса (который предлагает название)

  val nowMillsUTC = System.currentTimeMillis()

  val timeZoneID = "Australia/Perth"
  val tz = TimeZone.getTimeZone(timeZoneID)

  val simpleDateFormat = SimpleDateFormat("HH.mm  dd.MMM.yyyy", Locale.getDefault())
  simpleDateFormat.setTimeZone(tz)
  val resultTxt = simpleDateFormat.format(nowMillsUTC)

  print(timeZoneID + " -> " + resultTxt)
  //   Australia/Perth -> 19.59  21.Mar.2019

Вот как я это делаю на Android Build.VERSION.SDK_INT <26

      int offset = TimeZone.getDefault().getRawOffset();
String str_date='20:30 12-01-2021';
DateFormat formatter = new SimpleDateFormat("HH:mm dd-MM-yyy",Locale.US);
Date date = formatter.parse(str_date);
long utcTime = date.getTime() + (3600000*3);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm dd/MM/yyyy", Locale.US);
String dateStr = sdf.format(utcTime + offset);
System.out.println(dateStr);

Поскольку мой сервер отправляет время с часовым поясом -3, я должен добавить (3600*3) к getTime и сохранить его в utcTime, таким образом, utcTime находится в UTC. Затем я добавляю к utcTime смещение текущего часового пояса телефона. В моем случае, поскольку мой часовой пояс -3, он печатает:

      20:30 12/01/2021

Но если я изменю свой часовой пояс, дата также изменится.

Я уже отвечаю на него здесь:конвертировать UTC в местное время на Android

Попробуйте этот код

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z", Locale.ENGLISH);
String s = sdf.format(c.getTime());
String fDate = s.substring(0, s.length()-2) +":"+s.substring(s.length()-2, s.length());
Log.e("check", "formatted string: "+fDate);

Просто реорганизуйте этот код и замените Locale.getDefault() на нужный вам Locale

private SimpleDateFormat getDateFormat() {
    SimpleDateFormat dateFormat = (SimpleDateFormat) SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.DEFAULT, Locale.getDefault());
    String pattern = dateFormat.toLocalizedPattern();
    pattern = pattern.trim();
    dateFormat.applyLocalizedPattern(pattern);
    return dateFormat;
}

// А вот и использование

SimpleDateFormat sdf = getDateFormat ();

sdf.format (новая дата ());

Другие вопросы по тегам