Android: как получить текущий день недели (понедельник и т. Д.) На языке пользователя?

80

Я хочу знать, какой сегодня день недели (понедельник, вторник ...) на местном языке пользователя. Например, «Лунди», «Марди» и т. Д., Если пользователь француз.

Я прочитал этот пост, но он возвращает только int, а не строку с днем ​​на языке пользователя: как проще всего узнать текущий день недели в Android?

В более общем плане, как получить все дни недели и все месяцы года на языке пользователя?

Я думаю, что это возможно, так как, например, в повестке дня Google указаны дни и месяцы на местном языке пользователя.

Благодаря !!

Regis_AG
источник

Ответы:

168

Используйте SimpleDateFormat для форматирования даты и времени в удобочитаемую строку с учетом языкового стандарта пользователя.

Небольшой пример для получения текущего дня недели (например, «понедельник») :

SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
Date d = new Date();
String dayOfTheWeek = sdf.format(d);

источник
31

Попробуй это:

int dayOfWeek = date.get(Calendar.DAY_OF_WEEK);  
String weekday = new DateFormatSymbols().getShortWeekdays()[dayOfWeek];
almisoft
источник
Привет, если вы используете короткие дни недели, он показывает только одну букву, но мне нужно показать первые 3 буквы дня
санкар муниаппа
Обратите внимание, что для получения доступа ко всем доступным языкам следует использовать DateFormatSymbols.getInstance()(хотя на данный момент это может дать тот же результат).
user905686
20

Я знаю , что уже ответил , но кто ищет «Fri» , как это

для пт -

SimpleDateFormat sdf = new SimpleDateFormat("EEE");
Date d = new Date();
String dayOfTheWeek = sdf.format(d);

и кто хочет полную строку даты, они могут использовать 4E для пятницы

На пятницу-

SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
Date d = new Date();
String dayOfTheWeek = sdf.format(d);

Наслаждаться...

CrazyMind
источник
Во второй строке появляется сообщение об ошибке конструктора Date не определено.
17

Чтобы сделать вещи короче, вы можете использовать это:

android.text.format.DateFormat.format("EEEE", date);

который вернет день недели в виде строки.

Gswierczynski
источник
11

Ее то, что я использовал, чтобы получить названия дней ( 0-6означает monday - sunday):

public static String getFullDayName(int day) {
    Calendar c = Calendar.getInstance();
    // date doesn't matter - it has to be a Monday
    // I new that first August 2011 is one ;-)
    c.set(2011, 7, 1, 0, 0, 0);
    c.add(Calendar.DAY_OF_MONTH, day);
    return String.format("%tA", c);
}

public static String getShortDayName(int day) {
    Calendar c = Calendar.getInstance();
    c.set(2011, 7, 1, 0, 0, 0);
    c.add(Calendar.DAY_OF_MONTH, day);
    return String.format("%ta", c);
}
Knickedi
источник
6

tl; dr

String output = 
    LocalDate.now( ZoneId.of( "America/Montreal" ) )
             .getDayOfWeek()
             .getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ;

java.time

Классы java.time, встроенные в Java 8 и более поздние версии и перенесенные на Java 6 и 7 и Android, включают удобное DayOfWeekперечисление.

Дни нумеруются в соответствии со стандартом ISO 8601: 1-7 для понедельника-воскресенья.

DayOfWeek dow = DayOfWeek.of( 1 );

Это перечисление включает getDisplayNameметод для генерации строки локализованного переведенного названия дня.

LocaleОбъект указывает на человеческий язык , который будет использоваться в переводе, и задает культурные нормы, решать такие вопросы, как капитализация и пунктуации.

String output = DayOfWeek.MONDAY.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ;

Чтобы получить сегодняшнюю дату, используйте LocalDateкласс. Обратите внимание, что часовой пояс имеет решающее значение, поскольку в любой момент дата меняется по всему миру.

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DayOfWeek dow = today.getDayOfWeek();
String output = dow.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ;

Имейте в виду, что языковой стандарт не имеет ничего общего с часовым поясом. Это две разные ортогональные проблемы. Возможно, вам понадобится французская презентация даты и времени с зонированием в Индии ( Asia/Kolkata).

Джода-Тайм

ОБНОВЛЕНИЕ: проект Joda-Time , находящийся теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Библиотека Joda-Time обеспечивает Localeлокализацию значений даты и времени на основе управления.

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zone );

Locale locale = Locale.CANADA_FRENCH;
DateTimeFormatter formatterUnJourQuébécois = DateTimeFormat.forPattern( "EEEE" ).withLocale( locale );

String output = formatterUnJourQuébécois.print( now );

System.out.println("output: " + output );

вывод: samedi


О java.time

Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date, Calendar, и SimpleDateFormat.

Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .

Где взять классы java.time?

Василий Бурк
источник
5

Попробуй это...

//global declaration
private TextView timeUpdate;
Calendar calendar;

.......

timeUpdate = (TextView) findViewById(R.id.timeUpdate); //initialize in onCreate()

.......

//in onStart()
calendar = Calendar.getInstance();
//date format is:  "Date-Month-Year Hour:Minutes am/pm"
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy HH:mm a"); //Date and time
String currentDate = sdf.format(calendar.getTime());

//Day of Name in full form like,"Saturday", or if you need the first three characters you have to put "EEE" in the date format and your result will be "Sat".
SimpleDateFormat sdf_ = new SimpleDateFormat("EEEE"); 
Date date = new Date();
String dayName = sdf_.format(date);
timeUpdate.setText("" + dayName + " " + currentDate + "");

В результате ... введите описание изображения здесь

счастливого кодирования .....

Силамбарасан Поонгути
источник
4

Приносим извинения за поздний ответ, но это сработает правильно.

daytext=(textview)findviewById(R.id.day);

Calender c=Calender.getInstance();
SimpleDateFormat sd=new SimpleDateFormat("EEEE");
String dayofweek=sd.format(c.getTime());


daytext.setText(dayofweek);
Аджинкья
источник
2
(1) Это решение уже включено в принятый ответ . Объясните, как ваш увеличивает ценность, или удалите. (2) Эти классы теперь являются устаревшими и заменены классами java.time.
Basil
1

Я просто использую это решение в Котлине:

 var date : String = DateFormat.format("EEEE dd-MMM-yyyy HH:mm a" , Date()) as String
jafar_aml
источник
0
//selected date from calender
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy"); //Date and time
String currentDate = sdf.format(myCalendar.getTime());

//selcted_day name
SimpleDateFormat sdf_ = new SimpleDateFormat("EEEE");
String dayofweek=sdf_.format(myCalendar.getTime());
current_date.setText(currentDate);
lbl_current_date.setText(dayofweek);

Log.e("dayname", dayofweek);
савитри
источник
1
Это нечитаемо. И вы используете плохо спроектированные классы и давно устаревшие SimpleDateFormat, Dateи Calendar(также используемые в вопросе).
Ole VV