Преобразование формата PHP DateTime в Moment.js

Я пишу прототип javascript для строки, которая будет принимать формат DateTime PHP и преобразовывать его в формат Moment.js DateTime. Однако у меня возникла проблема с построением последней строки. У меня в основном это работает, но я не знаю, как сохранить нормальные символы. Проблема с моим кодом в том, что я в основном разбиваю строку любым не-альфа-символом. Это означает, что когда я перестраиваю преобразование, он не включает другой символ. Я не знаю, как решить эту проблему. Мой код ниже

String.prototype.toMoment = function() {
    var items = this.split(/[^A-Za-z]/);
    var returnItem = "";
    var conversions = {
        'd': 'DD',
        'D': 'ddd',
        'j': 'D',
        'l': 'dddd',
        'N': 'E',
        'S': 'o',
        'w': 'e',
        'z': 'DDD',
        'W': 'W',
        'F': 'MMMM',
        'm': 'MM',
        'M': 'MMM',
        'n': 'M',
        't': '',
        'L': '',
        'o': 'YYYY',
        'Y': 'YYYY',
        'y': 'YY',
        'a': 'a',
        'A': 'A',
        'B': '',
        'g': 'h',
        'G': 'H',
        'h': 'hh',
        'H': 'HH',
        'i': 'mm',
        's': 'ss',
        'u': 'SSS',
        'e': 'zz',
        'I': '',
        'O': '',
        'P': '',
        'T': '',
        'Z': '',
        'c': '',
        'r': '',
        'U': 'X',
    };

    for (var item in items) {
        returnItem += conversions[items[item]];
    }

    return returnItem;
}

например, если я использую следующий код moment().format('m/d/Y H:i:s'.toMoment()), он действительно работает и преобразует возвращаемую строку в MMDDYYYYHHmmss. Проблема в том, что мне нужно вернуть MM/DD/YYYY HH:mm:ss. Любая помощь будет оценена, спасибо!

можно просто добавить в конвертацию /?

Natsathorn 24.07.2018 17:01

нет, я закончил, мне нужно просто сделать .split(''), а затем написать оператор if, который проверяет, находится ли элемент в списке преобразования, если это так, преобразовать, если не добавить элемент в строку

Robert E. McIntosh 24.07.2018 17:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
756
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вместо разделения вы можете попробовать заменить заполнители новыми заполнителями:

String.prototype.toMoment = function() {
  var conversions = {
    'd': 'DD',
    'D': 'ddd',
    'j': 'D',
    'l': 'dddd',
    'N': 'E',
    'S': 'o',
    'w': 'e',
    'z': 'DDD',
    'W': 'W',
    'F': 'MMMM',
    'm': 'MM',
    'M': 'MMM',
    'n': 'M',
    't': '',
    'L': '',
    'o': 'YYYY',
    'Y': 'YYYY',
    'y': 'YY',
    'a': 'a',
    'A': 'A',
    'B': '',
    'g': 'h',
    'G': 'H',
    'h': 'hh',
    'H': 'HH',
    'i': 'mm',
    's': 'ss',
    'u': 'SSS',
    'e': 'zz',
    'I': '',
    'O': '',
    'P': '',
    'T': '',
    'Z': '',
    'c': '',
    'r': '',
    'U': 'X',
  };
  
  return this.replace(/[A-Za-z]+/g, function(match) {
    return conversions[match] || match;
  });
}

console.info('m/d/Y H:i:s'.toMoment());

Это тоже сработает, я проверю, какой из двух ответов работает лучше. Хотя мне больше нравится, как ты выглядишь. ржу не могу

Robert E. McIntosh 24.07.2018 17:05

Ваш работает примерно на 10-15% быстрее, я отмечу ваш как ответ, как только переполнение стека позволит мне. Спасибо за элегантный ответ.

Robert E. McIntosh 24.07.2018 17:09

Такой подход, вероятно, лучший с точки зрения гибкости и скорости.

ChrisM 24.07.2018 17:10

Я должен просто сделать .split(''), а затем написать оператор if, который проверяет, находится ли элемент в списке преобразования, если это так, преобразовать, если не добавить элемент в строку

   String.prototype.toMoment = function() {
        var items = this.split('');;
        var returnItem = "";
        var conversions = {
            'd': 'DD',
            'D': 'ddd',
            'j': 'D',
            'l': 'dddd',
            'N': 'E',
            'S': 'o',
            'w': 'e',
            'z': 'DDD',
            'W': 'W',
            'F': 'MMMM',
            'm': 'MM',
            'M': 'MMM',
            'n': 'M',
            't': '',
            'L': '',
            'o': 'YYYY',
            'Y': 'YYYY',
            'y': 'YY',
            'a': 'a',
            'A': 'A',
            'B': '',
            'g': 'h',
            'G': 'H',
            'h': 'hh',
            'H': 'HH',
            'i': 'mm',
            's': 'ss',
            'u': 'SSS',
            'e': 'zz',
            'I': '',
            'O': '',
            'P': '',
            'T': '',
            'Z': '',
            'c': '',
            'r': '',
            'U': 'X',
        };

        for (var item in items) {
            if (conversions[items[item]] != undefined) {
                returnItem += conversions[items[item]];
            }else{
                returnItem += items[item];
            }
        }

        return returnItem;
    }

Еще одна небольшая вариация, которая работает. Вы всегда можете просто сделать полное разделение, но добавить не буквенно-цифровые символы, которые вы хотите, в свой поиск перевода следующим образом:

String.prototype.toMoment = function() {
    var items = this.split("");
    var returnItem = "";
    var conversions = {
        'd': 'DD',
        'D': 'ddd',
        'j': 'D',
        'l': 'dddd',
        'N': 'E',
        'S': 'o',
        'w': 'e',
        'z': 'DDD',
        'W': 'W',
        'F': 'MMMM',
        'm': 'MM',
        'M': 'MMM',
        'n': 'M',
        't': '',
        'L': '',
        'o': 'YYYY',
        'Y': 'YYYY',
        'y': 'YY',
        'a': 'a',
        'A': 'A',
        'B': '',
        'g': 'h',
        'G': 'H',
        'h': 'hh',
        'H': 'HH',
        'i': 'mm',
        's': 'ss',
        'u': 'SSS',
        'e': 'zz',
        'I': '',
        'O': '',
        'P': '',
        'T': '',
        'Z': '',
        'c': '',
        'r': '',
        'U': 'X',
        '/': '/',
        ':': ':',
        ' ': ' '
    };

    for (var item in items) {
        returnItem += conversions[items[item]];
    }

    return returnItem;
}

console.info('m/d/Y H:i:s'.toMoment())

Это действительно зависит от того, что вы хотите сделать и какой контроль над результатом вам нужен.

Это сработает, но я думаю, что @ 31piy, вероятно, имеет лучшее универсальное решение, кажется, даже справляется с такими вещами, как когда некоторые просто вводят «вторник» в строку.

Robert E. McIntosh 24.07.2018 17:14

Да, я увидел его ответ незадолго до того, как опубликовал свой, и увидел, что замена регулярного выражения была предпочтительным инструментом, но все равно подумал, что все равно отправлю свои два цента.

ChrisM 24.07.2018 17:16

Другие вопросы по теме