Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正确的俄语月字符串翻译Java_Java_Date_Localization - Fatal编程技术网

正确的俄语月字符串翻译Java

正确的俄语月字符串翻译Java,java,date,localization,Java,Date,Localization,我想用下面的代码将日期转换成俄语 SimpleDateFormat.getDateInstance(SimpleDateFormat.LONG,locale).format(date); 其中locale的类型为locale 问题是没有正确解析月份。一月是“аааа”应该是“аааа”,二月是“фааа”应该是“фааа” 等等 一个想法是在我的逻辑中将不正确的月份转换为正确的月份 有什么东西可以让Java自动做到这一点吗 谢谢AFAIK,在JDK中没有对宾格本地化的支持。如果合适的话,我建议

我想用下面的代码将日期转换成俄语

SimpleDateFormat.getDateInstance(SimpleDateFormat.LONG,locale).format(date);
其中locale的类型为locale 问题是没有正确解析月份。一月是“аааа”应该是“аааа”,二月是“фааа”应该是“фааа”

等等

一个想法是在我的逻辑中将不正确的月份转换为正确的月份

有什么东西可以让Java自动做到这一点吗


谢谢

AFAIK,在JDK中没有对宾格本地化的支持。如果合适的话,我建议使用
MEDIUM
date格式:
15Фööv1999


否则,您可能最终不得不为月份名称提供自己的本地化信息。

在我的JDK-6安装中,我可以重现您的问题:

Date jud = new SimpleDateFormat("yyyy-MM-dd").parse("2014-02-28");
String month =
    DateFormat.getDateInstance(SimpleDateFormat.LONG, new Locale("ru")).format(jud);
System.out.println(month); // output: 28 Февраль 2014 г.
Java-8为您提供了一个解决方案。

JDK似乎已经将内部默认值从“独立样式”(主格)更改为“格式样式”(属格)

如果需要应用独立的textstyle,则必须设置自己的
DateTimeFormatterBuilder
,这需要更多的工作,否则
textstyle.FULL应为默认设置

String m = Month.FEBRUARY.getDisplayName(TextStyle.FULL , new Locale("ru")); 
// февраля (first and last char are different)

String s = Month.FEBRUARY.getDisplayName(TextStyle.FULL_STANDALONE , new Locale("ru")); 
// Февраль (this style can be used in DateTimeFormatterBuilder for the month field, too)
使用旧样式的Java-pre-8解决方案:

定义自己的文本资源(麻烦)

Joda Time在Java-pre-8环境中不能提供一个好的解决方案,因为它只委托给JDK。另请参见上的类似问题

最后还有我的库,它可以像Java-8一样解决这个问题,但它使用自己的俄语文本资源,并且理解两种形式(旧样式和独立样式),因此这是一个针对旧Java版本的简单解决方案(当然,Java-8不会因为许多其他功能增强而淘汰)


很抱歉,如果我的回答不完全符合这个问题,但仍然“我想分享我解决这个问题的方法,将日期翻译成俄文格式

在处理日期时间区域设置等问题时,我非常头疼,我开始简单地将工作日和月份转换为原始日期时间的字符串表示形式

String originalDate = "Tue, 22 Nov 2016 01:03:00 +0300";
Log.d("Date in Russian",convertStringDateToRussian(linkText));

public String convertStringDateToRussian(String mDate) {

    String[] engWeek = {
            "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
            "Sun"};
    String[] ruWeek = {
            "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота",
            "Воскресенье"};
    String[] engMonths = {
            "Jan", "Feb", "Mar", "Apr", "May", "Jun",
            "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
    String[] ruMonths = {
            "января", "февраля", "марта", "апреля", "мая", "июня",
            "июля", "августа", "сентября", "октября", "ноября", "декабря"};
    for (
            int t = 0;
            t < engWeek.length; t++)

    {
        if (mDate.contains(engWeek[t])) {
            mDate = mDate.replace(engWeek[t], ruWeek[t]);
            break;
        }
    }

    for (
            int t = 0;
            t < engMonths.length; t++)

    {
        if (mDate.contains(engMonths[t])) {
            mDate = mDate.replace(engMonths[t], ruMonths[t]);
            break;
        }
    }

    return mDate;
}
String originalDate=“2016年11月22日星期二01:03:00+0300”;
Log.d(“俄语日期”,转换为StringDateTorussian(链接文本));
公共字符串转换器StringDateTorussian(字符串mDate){
字符串[]英语周={
“周一”、“周二”、“周三”、“周四”、“周五”、“周六”,
“太阳”};
字符串[]ruWeek={
"Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота",
"Воскресенье"};
字符串[]engMonths={
“一月”、“二月”、“三月”、“四月”、“五月”、“六月”,
“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
字符串[]rumonts={
"января", "февраля", "марта", "апреля", "мая", "июня",
"июля", "августа", "сентября", "октября", "ноября", "декабря"};
为了(
int t=0;
t
虽然@Meno Hochschild和的答案是正确的,但我想补充一点

设置
Locale(“ru”)
,然后创建并应用
sdf.format(date)
,就足够了

但是如果你想定制它,我将展示一个过程

在许多例外之后,我意识到工作日不是从周一开始的(见)


对于Java8,可以使用新模式

简言之:
“LLLL”
模式将获得一个主格:

“MMMM”
模式将在属格中返回一个
字符串


或者,您可以使用
java.time.Month
enum,而不是在数组中硬编码俄语月份(因为我们有波兰语、乌克兰语和其他语言)。它同时包含月份
int
number和
String
name。

在我的任务中,我应该只从整数中得到一个月,因此此代码非常适合我:

int month=5;//for example
Month.of(month).getDisplayName(TextStyle.FULL_STANDALONE, new Locale("ru"));

如果二月份俄语标签的第一个字符在两种情况下略有不同,那么仅选择缩写形式无法解决问题。它不是第一个字符,而是最后一个字符。如果词形变化改变了第一个字母,俄语将是一种完全疯狂的语言!:-)请再仔细看看这些角色。第一个字符是不同的(根据我的分析,代码点1092和1060),尽管乍看起来非常相似。我相信这是关于大写的,但不是很确定(俄语不是我的语言)。最后一个字符因屈折变化而不同。在这里我们都同意。俄语恰好是我的母语,我可以确认“Ф”大写为“Ф”:-)谢谢你的信息。我不确定俄语中的大写字母有多重要,所以可能选择俄语缩写形式是可以接受的,要么大写,要么不大写(如果OP想要缩写)。谢谢,你选择了一种从英语到俄语的翻译方式。这是一种不同的方法,但是可以使用。但可能一种公认的语言(Java-8和Java-pre-8变体)可以工作。另外,不要忘记名字的小写:不是“Фааааа”,而是“Фаааа”。谢谢您的回复。这个解决方案在Android中可能更有用,因为我根本无法为DateTime提供“RU”语言环境。如果您想使用Android,我在本主题中为它添加了一个解决方案。
DateFormatSymbols
正是我想要的。非常感谢你,我的朋友。你救了我一天
System.out.println(
    ChronoFormatter.ofDateStyle(DisplayMode.FULL, new Locale("ru")).format(
        PlainDate.of(2014, Month.FEBRUARY, 28)
    )
); // output: 28 февраля 2014 г.
String originalDate = "Tue, 22 Nov 2016 01:03:00 +0300";
Log.d("Date in Russian",convertStringDateToRussian(linkText));

public String convertStringDateToRussian(String mDate) {

    String[] engWeek = {
            "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
            "Sun"};
    String[] ruWeek = {
            "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота",
            "Воскресенье"};
    String[] engMonths = {
            "Jan", "Feb", "Mar", "Apr", "May", "Jun",
            "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
    String[] ruMonths = {
            "января", "февраля", "марта", "апреля", "мая", "июня",
            "июля", "августа", "сентября", "октября", "ноября", "декабря"};
    for (
            int t = 0;
            t < engWeek.length; t++)

    {
        if (mDate.contains(engWeek[t])) {
            mDate = mDate.replace(engWeek[t], ruWeek[t]);
            break;
        }
    }

    for (
            int t = 0;
            t < engMonths.length; t++)

    {
        if (mDate.contains(engMonths[t])) {
            mDate = mDate.replace(engMonths[t], ruMonths[t]);
            break;
        }
    }

    return mDate;
}
public static String formatDate(long date, String format) {
    Locale locale = new Locale("ru");
    SimpleDateFormat sdf = new SimpleDateFormat(format, locale);
    return sdf.format(date);
}
public static String formatDate(long date, String format) {
    //Locale locale = new Locale("fr");
    Locale locale = new Locale("ru");
    DateFormatSymbols dfs = DateFormatSymbols.getInstance(locale);
    String[] months = {
            "января", "февраля", "марта", "апреля", "мая", "июня",
            "июля", "августа", "сентября", "октября", "ноября", "декабря"};
    String[] shortMonths = {
            "янв", "фев", "мар", "апр", "май", "июн",
            "июл", "авг", "сен", "окт", "ноя", "дек"};
    dfs.setMonths(months);
    dfs.setShortMonths(shortMonths);
    String[] weekdays = {"", "Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"};
    String[] shortWeekdays = {"", "вс", "пн", "вт", "ср", "чт", "пт", "сб"};
    dfs.setWeekdays(weekdays);
    dfs.setShortWeekdays(shortWeekdays);

    SimpleDateFormat sdf = new SimpleDateFormat(format, locale);
    sdf.setDateFormatSymbols(dfs);
    return sdf.format(date); // пт, 09 декабря 2016
}
new SimpleDateFormat("LLLL", Locale.getDefault()).format(date); // январь
new SimpleDateFormat("MMMM", Locale.getDefault()).format(date); // января
int month=5;//for example
Month.of(month).getDisplayName(TextStyle.FULL_STANDALONE, new Locale("ru"));