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 даты и времени .
- По какой-либо причине, если вам нужно придерживаться Java 6 или Java 7, вы можете использовать ThreeTen-Backport, который переносит большую часть функций java.time на Java 6 и 7.
- Если вы работаете над проектом Android и ваш уровень API Android по-прежнему не соответствует Java-8, ознакомьтесь с API Java 8+, доступными через дешугаринг, и разделом « Как использовать ThreeTenABP в Android Project» .
Использование современного 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 (новая дата ());