Как правильно отформатировать в соответствии с датой и временем конфигурации устройства при наличии года, месяца, дня, часа и минуты?
Используйте стандартный класс Java DateFormat.
Например, чтобы отобразить текущую дату и время, выполните следующие действия:
Date date = new Date(location.getTime());
DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));
Вы можете инициализировать объект Date своими собственными значениями, однако вы должны знать, что конструкторы устарели, и вы действительно должны использовать объект Java Calendar.
Для Android IME довольно типично иметь два класса, оба из которых утверждают, что дают результат, установленный на локаль по умолчанию, но один нет. Так что да, не забудьте использовать версию DateFormat android.text.format (которая даже не является производным от java.util one LOL).
у меня проблема с тем, что я должен импортировать - я имею в виду файлы lib :(
@Harsha - чтобы обойти эту проблему, я связываю свое использование DateFormat, поэтому мне нужно только ссылаться на класс Android, и поэтому нет никаких неоднозначных классов. final String dateStr = DateFormat.getDateFormat (this) .format (d); Вы можете использовать метод Android format () и иметь (IMHO) более чистый код и на один объект меньше для создания экземпляра.
Это средство форматирования включает только дату, а не время, как указано в исходном вопросе. Вместо этого используйте DateUtils из того же пакета, см. stackoverflow.com/questions/2983920/…
Обратите внимание на эту строку: DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext()); Возвращаемый dateFormat имеет тип java.text.DateFormat (а НЕ android.text.format.DateFormat)
К сожалению, это может работать не на всех устройствах. Я тестирую с HTC desire с «Выберите формат даты» в настройках как ddd, MMM dd, yyyy, а dateformatter возвращает MM / dd / yy!
Для полного формата используйте api. android.text.format.DateFormat.getLongDateFormat (Контекст);
@JerryBrady, по-вашему, чище, возможно, вы захотите написать его как отдельный ответ.
Это сделает это:
Date date = new Date();
java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));
Будет ли это локализовано, когда пользователь меняет язык на устройстве Android?
На мой взгляд, android.text.format.DateFormat.getDateFormat(context) сбивает меня с толку, потому что этот метод возвращает java.text.DateFormat, а не android.text.format.DateFormat - - ".
Итак, я использую код фрагмента, как показано ниже, чтобы получить текущую дату / время в моем формате.
android.text.format.DateFormat df = new android.text.format.DateFormat();
df.format("yyyy-MM-dd hh:mm:ss a", new java.util.Date());
or
android.text.format.DateFormat.format("yyyy-MM-dd hh:mm:ss a", new java.util.Date());
Кроме того, вы можете использовать другие форматы. Следуйте Формат даты.
Полезно, но вопрос сказал "по конфигурации устройства". Для меня это означает использование формата, выбранного на основе языка / страны пользователя или выбранного пользователем напрямую, а не жесткого кодирования выбора формата.
Кроме того, не забывайте, что hh:mm:ss даст вам 01:00:00 в час дня, вам нужно будет использовать kk:mm:ss, чтобы получить 13:00:00
@dnet k - это час в день (1-24), вы не имеете в виду H, который является часом в день (0-23), например. ЧЧ: мм: сс? См .: developer.android.com/reference/java/text/SimpleDateFormat.h tml
@Joony, нет, есть разница между java.text.SimpleDateFormat (то, что вы связали и использует H в течение часов в диапазоне 0-23) и android.text.format.DateFormat (о чем идет ответ, и использует k в течение нескольких часов в диапазоне 0-23)
@dnet После тестирования вы правы насчет k, однако в документации по DateFormat четко указано, что Каноническую документацию по форматным строкам см. В SimpleDateFormat. Очень сбивает с толку. Или я что-то упускаю?
Похоже, что формат - это статический метод в android.text.format.DateFormat.
@Joony, я вижу ваше замешательство, и у меня был огромный момент WTF, см. этот коммит для android...DateFormat, но похоже, что SimpleDateFormat работает так, как задумано.
Вы также можете использовать android.text.format.DateFormat.getLongDateFormat ().
Этот код вернет текущую дату и время:
public String getCurrDate()
{
String dt;
Date cal = Calendar.getInstance().getTime();
dt = cal.toLocaleString();
return dt;
}
toLocaleString () устарела
Пытаться:
event.putExtra("startTime", "10/05/2012");
И когда вы обращаетесь к переданным переменным:
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = formatter.parse(bundle.getString("startTime"));
Используйте эти две как переменные класса:
public java.text.DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
private Calendar mDate = null;
И используйте это так:
mDate = Calendar.getInstance();
mDate.set(year,months,day);
dateFormat.format(mDate.getTime());
Используйте SimpleDateFormat
Как это:
event.putExtra("starttime", "12/18/2012");
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
Date date = format.parse(bundle.getString("starttime"));
Да, с языковой стандарт по умолчанию, чтобы избежать проблем с производительностью: new SimpleDateFormat("my-format", Locale.getDefault());
Используйте сборку в классе Time!
Time time = new Time();
time.set(0, 0, 17, 4, 5, 1999);
Log.i("DateTime", time.format("%d.%m.%Y %H:%M:%S"));
Это оптимальное решение, поскольку в нем используется облегченный объект Time из Android Framework: developer.android.com/reference/android/text/format/Time.htm l
Это нет - оптимальное решение: он не соблюдает формат даты из локали пользователя.
Класс Android Time предоставляет 3 метода форматирования http://developer.android.com/reference/android/text/format/Time.html
Вот как я это сделал:
/**
* This method will format the data from the android Time class (eg. myTime.setToNow()) into the format
* Date: dd.mm.yy Time: hh.mm.ss
*/
private String formatTime(String time)
{
String fullTime= "";
String[] sa = new String[2];
if (time.length()>1)
{
Time t = new Time(Time.getCurrentTimezone());
t.parse(time);
// or t.setToNow();
String formattedTime = t.format("%d.%m.%Y %H.%M.%S");
int x = 0;
for(String s : formattedTime.split("\\s",2))
{
System.out.println("Value = " + s);
sa[x] = s;
x++;
}
fullTime = "Date: " + sa[0] + " Time: " + sa[1];
}
else{
fullTime = "No time data";
}
return fullTime;
}
Надеюсь, это поможет :-)
Я использую это так:
public class DateUtils {
static DateUtils instance;
private final DateFormat dateFormat;
private final DateFormat timeFormat;
private DateUtils() {
dateFormat = android.text.format.DateFormat.getDateFormat(MainApplication.context);
timeFormat = android.text.format.DateFormat.getTimeFormat(MainApplication.context);
}
public static DateUtils getInstance() {
if (instance == null) {
instance = new DateUtils();
}
return instance;
}
public synchronized static String formatDateTime(long timestamp) {
long milliseconds = timestamp * 1000;
Date dateTime = new Date(milliseconds);
String date = getInstance().dateFormat.format(dateTime);
String time = getInstance().timeFormat.format(dateTime);
return date + " " + time;
}
}
После этого: http://developer.android.com/reference/android/text/format/Time.html
Лучше использовать собственный класс времени Android:
Time now = new Time();
now.setToNow();
Затем отформатируйте:
Log.d("DEBUG", "Time "+now.format("%d.%m.%Y %H.%M.%S"));
@FireZenk: Согласно [ссылке] (developer.android.com/reference/android/text/format/Time.htm l), которую вы предоставили: У этого класса есть ряд проблем, и вместо него рекомендуется использовать GregorianCalendar..
О ... эта информация о проблеме новее, чем мой комментарий, так что это устаревший ответ
Это мой метод, вы можете определить и формат ввода и вывода.
public static String formattedDateFromString(String inputFormat, String outputFormat, String inputDate){
if (inputFormat.equals("")){ // if inputFormat = "", set a default input format.
inputFormat = "yyyy-MM-dd hh:mm:ss";
}
if (outputFormat.equals("")){
outputFormat = "EEEE d 'de' MMMM 'del' yyyy"; // if inputFormat = "", set a default output format.
}
Date parsed = null;
String outputDate = "";
SimpleDateFormat df_input = new SimpleDateFormat(inputFormat, java.util.Locale.getDefault());
SimpleDateFormat df_output = new SimpleDateFormat(outputFormat, java.util.Locale.getDefault());
// You can set a different Locale, This example set a locale of Country Mexico.
//SimpleDateFormat df_input = new SimpleDateFormat(inputFormat, new Locale("es", "MX"));
//SimpleDateFormat df_output = new SimpleDateFormat(outputFormat, new Locale("es", "MX"));
try {
parsed = df_input.parse(inputDate);
outputDate = df_output.format(parsed);
} catch (Exception e) {
Log.e("formattedDateFromString", "Exception in formateDateFromstring(): " + e.getMessage());
}
return outputDate;
}
Java.util.Date, .Calendar и SimpleDateFormat в Java (и Android), как известно, вызывают проблемы. Избежать их. Они настолько плохи, что Sun / Oracle отказались от них, заменив их новым пакетом java.time в Java 8 (не в Android с 2014 года). Новый java.time был вдохновлен библиотекой Джода-Тайм.
Джода-Тайм действительно работает в Android.
Поищите в StackOverflow "Joda", чтобы найти множество примеров и обсуждение.
Лакомый кусок исходного кода с использованием Joda-Time 2.4.
Стандартный формат.
String output = DateTime.now().toString();
// Current date-time in user's default time zone with a String representation formatted to the ISO 8601 standard.
Локализованный формат.
String output = DateTimeFormat.forStyle( "FF" ).print( DateTime.now() );
// Full (long) format localized for this user's language and culture.
Я использую SimpleDateFormat без нестандартного рисунка для получения актуальной даты и времени из системы в формате устройство предварительно выбрано:
public static String getFormattedDate() {
//SimpleDateFormat called without pattern
return new SimpleDateFormat().format(Calendar.getInstance().getTime());
}
возвращается:
Date to Locale строка даты:
Date date = new Date();
String stringDate = DateFormat.getDateTimeInstance().format(date);
Параметры:
DateFormat.getDateInstance()
-> 31 декабря 1969 г.
DateFormat.getDateTimeInstance()
-> 31 декабря 1969 г., 16:00:00
DateFormat.getTimeInstance()
-> 16:00:00
Как удалить год из DateFormat.getDateInstance ()?
Слишком поздно, но может кому-то помочь
DateFormat.format(format, timeInMillis);
вот format какой формат тебе нужен
например: «ЧЧ: мм» возвращает 15:30.
Вернемся к 2016 году, когда я хочу настроить формат (не в соответствии с конфигурацией устройства, как вы спрашиваете ...), я обычно использую файл строковых ресурсов:
в strings.xml:
<string name = "myDateFormat"><xliff:g id = "myDateFormat">%1$td/%1$tm/%1$tY</xliff:g></string>
В действии:
Log.d(TAG, "my custom date format: "+getString(R.string.myDateFormat, new Date()));
Это также полезно с выпуском нового Библиотека привязки даты.
Так что у меня может быть что-то вроде этого в файле макета:
<TextView
android:id = "@+id/text_release_date"
android:layout_width = "wrap_content"
android:layout_height = "0dp"
android:layout_weight = "1"
android:padding = "2dp"
android:text = "@{@string/myDateFormat(vm.releaseDate)}"
tools:text = "0000"
/>
И в классе java:
MovieDetailViewModel vm = new MovieDetailViewModel();
vm.setReleaseDate(new Date());
Остальные ответы в целом верны. Я хотел бы предложить современный ответ. Классы Date, DateFormat и SimpleDateFormat, используемые в большинстве других ответов, давно устарели и доставляли проблемы многим программистам на протяжении многих лет. Сегодня у нас намного лучше java.time, AKA JSR-310, современный API даты и времени Java. Можете ли вы использовать это на Android? Несомненно! Современные классы были перенесены на Android в проекте ThreeTenABP. См. Все подробности в этот вопрос: Как использовать ThreeTenABP в Android Project.
Этот фрагмент должен помочь вам начать:
int year = 2017, month = 9, day = 28, hour = 22, minute = 45;
LocalDateTime dateTime = LocalDateTime.of(year, month, day, hour, minute);
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
System.out.println(dateTime.format(formatter));
Когда я устанавливаю в качестве предпочтительного языка своего компьютера английский (США) или английский (Великобритания), печатается следующее:
Sep 28, 2017 10:45:00 PM
Когда вместо этого я установил датский язык, я получаю:
28-09-2017 22:45:00
Так что он соответствует конфигурации. Однако я не уверен, в каких деталях он соответствует настройкам даты и времени вашего устройства, и это может варьироваться от телефона к телефону.
Чтобы получить дату или время в формате локали в миллисекундах, я использовал это:
Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.getDefault());
dateFormat.format(date);
Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault());
dateFormat.format(date);
Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault());
dateFormat.format(date);
Вы можете использовать другой стиль даты и времени. Подробнее о стилях здесь.
Этот код работает для меня!
Date d = new Date();
CharSequence s = android.text.format.DateFormat.format("MM-dd-yy hh-mm-ss",d.getTime());
Toast.makeText(this,s.toString(),Toast.LENGTH_SHORT).show();
Вы можете использовать DateFormat. Результат зависит от локали по умолчанию телефона, но вы также можете указать локаль:
https://developer.android.com/reference/java/text/DateFormat.html
Это результаты на
DateFormat.getDateInstance().format(date)
FR Локаль: 3 ноя. 2017 г.
Регион США / Англия: 12 января 1952 г.
DateFormat.getDateInstance(DateFormat.SHORT).format(date)
FR Локаль: 11.03.2017
Регион США / En: 12.13.52
DateFormat.getDateInstance(DateFormat.MEDIUM).format(date)
FR Локаль: 3 ноя. 2017 г.
Регион США / Англия: 12 января 1952 г.
DateFormat.getDateInstance(DateFormat.LONG).format(date)
FR Локаль: 3 ноября 2017 г.
Регион США / Англия: 12 января 1952 г.
DateFormat.getDateInstance(DateFormat.FULL).format(date)
FR Locale: vendredi 3 ноября 2017 г.
Регион США / Англия: вторник, 12 апреля 1952 г.
DateFormat.getDateTimeInstance().format(date)
FR Локаль: 3 ноя. 2017 16:04:58
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date)
FR Локаль: 11.03.2017 16:04
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM).format(date)
FR Локаль: 11.03.2017 16:04:58
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG).format(date)
FR Локаль: 11.03.2017 16:04:58 GMT + 01: 00
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.FULL).format(date)
FR Регион: 11.03.2017 16:04:58 heure normale d’Europe centrale
DateFormat.getTimeInstance().format(date)
FR Локаль: 16:04:58
DateFormat.getTimeInstance(DateFormat.SHORT).format(date)
FR Локаль: 16:04
DateFormat.getTimeInstance(DateFormat.MEDIUM).format(date)
FR Локаль: 16:04:58
DateFormat.getTimeInstance(DateFormat.LONG).format(date)
FR Локаль: 16:04:58 GMT + 01: 00
DateFormat.getTimeInstance(DateFormat.FULL).format(date)
FR Locale: 16:04:58 heure normale d’Europe centrale
Спасибо, что собрали все эти кейсы в одном месте. Если бы вы могли добавлять кейсы только на время, это сделало бы его полным справочником.
Я спрашиваю, почему документация не такая уж строгая, большое спасибо
Кратчайший путь:
// 2019-03-29 16:11
String.format("%1$tY-%<tm-%<td %<tR", Calendar.getInstance())
%tR - это сокращение от %tH:%tM, < означает повторное использование последнего параметра (1$).
Эквивалент String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM", Calendar.getInstance())
https://developer.android.com/reference/java/util/Formatter.html
Это, безусловно, самый короткий подход, хотя он не сработал для меня на Kotlin без удаления символа доллара: String.format("%1tY-%<tm-%<td %<tR", Calendar.getInstance())
Класс формата даты работает с чит-кодом для создания даты. Нравиться
Вы можете проверить больше читов здесь.
Вот самый простой способ:
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a", Locale.US);
String time = df.format(new Date());
и если вы ищете узоры, отметьте это https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
EEE : Day ( Mon )
MMM : Month in words ( Dec )
MM : Day in Count ( 324 )
mm : Month ( 12 )
dd : Date ( 3 )
HH : Hours ( 12 )
mm : Minutes ( 50 )
ss : Seconds ( 34 )
yyyy: Year ( 2020 ) //both yyyy and YYYY are same
YYYY: Year ( 2020 )
zzz : GMT+05:30
aa : ( AM / PM )
Заглавная ГГГГ может в некоторых случаях раздавиться, лучше использовать строчные буквы.
ЕСЛИ ВЫ НЕ ХОТИТЕ ИСПОЛЬЗОВАТЬ SIMPLEDATEFORMATTER
fun formatt(date : Date?): String{
val datef = this.Alarmdate
val myformatter = android.text.format.DateFormat.format(" HH:mm EE, dd MMM", datef)
return myformatter.toString()
}
использовать это
android.text.format.DateFormat.format(" HH:mm EE, dd MMM", datef)
первый параметр - это строка настраиваемого формата, второй параметр - это дата, которую вы хотите отформатировать.
Это android.text.format.DateFormat, а не java.text.DateFormat.