Java заменяет символ в строке между двумя символами, используя индексы из функции подстроки - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть дата в строке вроде этой: 10-10-2018, которую я хочу отображать как 10 октября 2018, я делаю следующее:

String date = "10-10-2018";
String newDate = date.replace(date.subString(date.indexOf("-")+1,date.lastIndexOf("-")),"October");

Вместо того, чтобы получать 10 октября 2018 года, я получаю октябрь-октябрь 2018 года, почему оба экземпляра заменены на 10, хотя я выбираю средний между символом "-". Чего мне не хватает

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Это то, что вам нужно:)

public static void main(String[] args) throws ParseException {
    String date = "10-10-2018";

    SimpleDateFormat givenFormat = new SimpleDateFormat("dd-MM-yyyy");  
    SimpleDateFormat newFormat = new SimpleDateFormat("dd-MMM-yyyy");


    Date givenDate=givenFormat.parse(date); 
    System.out.println(givenDate);


    String newDate=newFormat.format(givenDate); 
    System.out.println(newDate);
}
0 голосов
/ 02 ноября 2018
String newDate = date.replace(date.subString(date.indexOf("-")+1,date.lastIndexOf("-")),"October");

Давайте развернем это. Вы неявно

int firstHyphen = date.indexOf("-");
int lastHyphen = date.lastIndexOf("-");

Но для данной строки это то же самое, что сказать

int firstHyphen = 2;
int lastHyphen = 5;

Далее у вас есть неявное создание переменной

String month = date.subString(firstHyphen+1, lastHyphen);

Что совпадает с

String month = date.subString(3, 5);

Но какая подстрока начинается с 3 и заканчивается до 5?

String month = "10";

Итак, мы можем взять ваш оригинальный код и заменить его на

String newDate = date.replace("10", "October");

Теперь должно быть ясно, что вы НЕ ограничены только той частью строки между дефисами. Это ограничение применяется только к подстроке. Как только вы используете результат подстроки в замене, вы просто передаете ей строку. В частности, вы передаете "10", который дважды появляется в строке, поэтому он заменяет его дважды.

Если вы хотите попытаться сделать это, вы можете изменить свой исходный код, чтобы он выглядел как

String newDate = date.replace(date.subString(date.indexOf("-"), date.lastIndexOf("-")), "-October");

Это заменит "-10" на "-October". Поскольку "-10" встречается в строке только один раз, выполняется только одна замена.

Если у вас есть Map, который отображает целые месяцы на имена, вы можете использовать его как

Map<String, String> months = new HashMap<>();
months.put("10", "October");
String month = date.subString(date.indexOf("-"), date.lastIndexOf("-"));
String newDate = date.replace(month, "-" + months.get(month.subString(1)));

Это строит "-October" на лету и будет работать в течение других месяцев, при условии, что вы заполните ими карту. Но, как отметили другие, может быть более надежным использовать вместо этого встроенный в Java синтаксический анализ и форматирование даты.

0 голосов
/ 02 ноября 2018

Простая проблема заключается в том, что вы заменяете строку "10" на "October" в строке, где есть другие экземпляры той же подстроки.

Ваш звонок эквивалентен:

date.replace("10", "October");

Что также заменит первый экземпляр "10". Документы String.replace содержат это:

Заменяет каждую подстроку этой строки, которая соответствует литеральной целевой последовательности указанной литеральной последовательностью замены. Замена продолжается от начала строки до конца, например, замена «aa» на «b» в строке «aaa» приведет к «ba», а не «ab».

Более надежный подход - использовать API даты / времени для анализа и форматирования вашей даты:

String date = "10-10-2018";
LocalDate d = LocalDate.parse(date, DateTimeFormatter.ofPattern("dd-MM-yyyy"));
String newDate = d.format(DateTimeFormatter.ofPattern("dd-MMMM-yyyy"));

newDate оценивается как "10-October-2018", как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...