Android: як отримати поточний день тижня (понеділок тощо ...) мовою користувача?


80

Я хочу знати, яким є поточний день тижня (понеділок, вівторок ...) місцевою мовою користувача. Наприклад, "Lundi" "Mardi" тощо ... якщо користувач французький.

Я прочитав цю публікацію, але вона повертає лише int, а не рядок із днем ​​мовою користувача: Який найпростіший спосіб отримати поточний день тижня в Android?

В цілому, як ви отримуєте всі дні тижня та всі місяці року, написані мовою користувача?

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

Дякую !!

Відповіді:


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];

Привіт, якщо ви використовуєте короткі вихідні, він показує лише одну букву. Але мені потрібно показати перші 3 букви дня
Санкар Муніяппа

Зверніть увагу, що для отримання доступу до всіх доступних локалей слід користуватися DateFormatSymbols.getInstance()(хоча наразі це може дати той самий результат).
user905686

20

Я вже відповів, але хто шукає "п'ятницю", як це

для п'ятниці -

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);

Насолоджуйтесь ...


Я отримую повідомлення про помилку у вашому 2-му рядку про те, що дата конструктора не визначена.

17

Щоб зробити речі коротшими, ви можете використовувати це:

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

який поверне день тижня як рядок.


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);
}

6

tl; д-р

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

ОНОВЛЕННЯ: Проект Joda-Time , який зараз перебуває в режимі обслуговування , радить перейти до класів java.time .

Бібліотека Joda-Time забезпечує Locale-driven локалізацію значень дати та часу.

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 );

вихід: самаді


Про java.time

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

Проект Joda-Time , який зараз перебуває в режимі обслуговування , радить перейти на класи java.time .

Щоб дізнатись більше, див. Підручник Oracle . І шукайте в Stack Overflow багато прикладів та пояснень. Специфікація - JSR 310 .

Де отримати класи java.time?

  • Java SE 8 і SE 9 і пізніших версій
    • Вбудований.
    • Частина стандартного Java API із комплексною реалізацією.
    • Java 9 додає деякі незначні функції та виправлення.
  • Java SE 6 і SE 7
    • Значна частина функцій java.time переноситься назад на Java 6 і 7 у ThreeTen-Backport .
  • Android

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.
Василь Бурк

1

Я просто використовую це рішення в Kotlin:

 var date : String = DateFormat.format("EEEE dd-MMM-yyyy HH:mm a" , Date()) as String


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(також використовувані в питанні).
Оле В. В.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.