Получить значение дня месяца из объекта Date в Android?
Используя этот код:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse(dtStart);
return date;
Я преобразовал String Date by Date Object и получил значение:
Вс 17 февраля 07:00:00 мск 2013
Теперь я хочу извлечь день (воскресенье/понедельник) и месяц отсюда.
Ответы
Ответ 1
import android.text.format.DateFormat;
String dayOfTheWeek = (String) DateFormat.format("EEEE", date); // Thursday
String day = (String) DateFormat.format("dd", date); // 20
String monthString = (String) DateFormat.format("MMM", date); // Jun
String monthNumber = (String) DateFormat.format("MM", date); // 06
String year = (String) DateFormat.format("yyyy", date); // 2013
Ответ 2
Вы можете попробовать:
String input_date="01/08/2012";
SimpleDateFormat format1=new SimpleDateFormat("dd/MM/yyyy");
Date dt1=format1.parse(input_date);
DateFormat format2=new SimpleDateFormat("EEEE");
String finalDay=format2.format(dt1);
Также попробуйте следующее:
Calendar c = Calendar.getInstance();
c.setTime(yourDate);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
Ответ 3
в пользовательские дни недели вы можете использовать эту функцию
public static String getDayFromDateString(String stringDate,String dateTimeFormat)
{
String[] daysArray = new String[] {"saturday","sunday","monday","tuesday","wednesday","thursday","friday"};
String day = "";
int dayOfWeek =0;
//dateTimeFormat = yyyy-MM-dd HH:mm:ss
SimpleDateFormat formatter = new SimpleDateFormat(dateTimeFormat);
Date date;
try {
date = formatter.parse(stringDate);
Calendar c = Calendar.getInstance();
c.setTime(date);
dayOfWeek = c.get(Calendar.DAY_OF_WEEK)-1;
if (dayOfWeek < 0) {
dayOfWeek += 7;
}
day = daysArray[dayOfWeek];
} catch (Exception e) {
e.printStackTrace();
}
return day;
}
dateTimeFormat, например dateTimeFormat = "yyyy-MM-dd HH: mm: ss";
Ответ 4
ТЛ; др
Если ваша дата и время были предназначены для UTC:
LocalDateTime // Represent a date and time-of-day lacking the context of a time zone or offset-from-UTC. Does *NOT* represent a moment.
.parse( // Convert from text to a date-time object.
"2013-02-17 07:00:00"
.replace( " " , "T" ) // Comply with standard ISO 8601 format.
) // Returns a 'LocalDateTime' object.
.atOffset( // Determining a moment by assign an offset-from-UTC. Do this only if you are certain the date and time-of-day were intended for this offset.
ZoneOffset.UTC // An offset of zero means UTC itself.
) // Returns a 'OffsetDateTime' object. Represents a moment.
.getDayOfWeek() // Extract the day-of-week enum object.
.getDisplayName( // Localize, producing text.
TextStyle.FULL , // Specify how long or abbreviated.
Locale.US // Specify language and cultural norms to use in localization.
) // Returns a 'String' object.
Воскресенье
А также…
…
.getMonth()
.getDisplayName( TextStyle.FULL , Locale.US )
февраль
java.time
Современное решение использует классы java.time, которые много лет назад вытеснили ужасные старые классы даты и времени, такие как Date
& SimpleDateFormat
.
Часовой пояс
Ваш код игнорирует критическую проблему часового пояса. Когда вы опускаете конкретную зону или смещение от UTC, текущий часовой пояс JVM по умолчанию применяется неявно. Так что ваши результаты могут отличаться.
Вместо этого всегда указывайте часовой пояс или смещение явно в своем коде.
LocalDateTime
В вашем формате ввода ГГГГ-ММ-ДД ЧЧ: ММ: СС отсутствует индикатор часового пояса или смещения от UTC.
Таким образом, мы должны проанализировать как LocalDateTime
.
Ваш формат ввода близок к стандартному формату ISO 8601, используемому по умолчанию в классе LocalDateTime
. Просто замените ПРОБЕЛ в середине буквой T
String input = "2013-02-17 07:00:00".replace( " " , "T" ) ;
LocalDateTime ldt = LocalDateTime.parse( input ) ;
ldt.toString(): 2013-02-17T07: 00
LocalDateTime
вас сейчас есть, не представляет момент, не является точкой на временной шкале. Умышленное отсутствие часового пояса или смещения означает, что он по определению не может представлять момент. LocalDateTime
представляет потенциальные моменты в диапазоне около 26-27 часов, диапазон часовых поясов по всему миру.
ZonedDateTime
Если вы точно знаете часовой пояс, предназначенный для этой даты и времени, примените ZoneId
чтобы получить ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
С ZonedDateTime
вас есть момент.
Получите день недели, используя перечисление DayOfWeek
.
DayOfWeek dow = zdt.getDayOfWeek() ;
Метод DayOfWeek::getDisplayName
переводит название дня на любой человеческий язык, указанный в Locale
например Locale.US
или Locale.CANADA_FRENCH
.
String output = dow.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );
Dimanche
Или в американском английском.
String output = dow.getDisplayName( TextStyle.FULL , Locale.US );
Воскресенье
Аналогично для месяца, используйте перечисление Month
.
Month m = zdt.getMonth() ;
String output = m.getDisplayName( TextStyle.FULL , Locale.US );
февраль
OffsetDateTime
Если вы точно знаете, что дата и время суток в LocalDateTime
должны были представлять момент в UTC, используйте класс OffsetDateTime
.
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ; // Assign UTC (an offset of zero hours-minutes-seconds).
MonthDay
Вас также может заинтересовать класс MonthDay
если вы хотите работать без дня и месяца.
MonthDay md = MonthDay.from( zdt ) ;
О java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытеснять неприятные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, и SimpleDateFormat
.
Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.
Чтобы узнать больше, смотрите Oracle Tutorial. И поиск для многих примеров и объяснений. Спецификация JSR 310.
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.
Ответ 5
public static String getDayFromStringDate(String stringDate, String dateFormat, boolean abbreviated) throws ParseException {
String pattern;
if (abbreviated) {
pattern = "E"; // For short day eg: Mon,Tue
} else {
pattern = "EEEE"; // For compete day eg: Monday, Tuesday
}
return new SimpleDateFormat(pattern)
.format(new SimpleDateFormat(dateFormat).parse(stringDate));
}
Например: если stringDate: - 16/12/2018, тогда dateFormat: - dd/MM/гггг
Ответ 6
Попробуйте использовать класс java.util.Calendar.
String dateString = "20/12/2018";
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date readDate = df.parse(dateString);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(readDate.getTime());
Log.d(TAG, "Year: "+cal.get(Calendar.YEAR));
Log.d(TAG, "Month: "+cal.get(Calendar.MONTH));
Log.d(TAG, "Day: "+cal.get(Calendar.DAY_OF_MONTH));