Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 09.06.2022
Сообщений: 2

Как Отобразить Дату Прописью

09.06.2022, 18:23. Показов 2188. Ответов 5

Студворк — интернет-сервис помощи студентам
PHP Как Отобразить Дату Прописью
(как в доверенности)
Вопрос:
Как сделать, чтобы всю дату словами?
****
Задача простая:
Берём дату, например: 23/05/2016
Получаем:
двадцать третье мая две тысячи шестнадцатого года
****
У меня получилось при помощи array отобразить:
23 мая 2016 года

PHP/HTML
1
2
3
4
5
<span style="color:#000000;font-family:Arial;font-size:21px;"><?php
$date = date("j F Y года",strtotime("2016-05-23"));
$strEng = array("January","February","March","April","May","June","July","August","September","October","November","December");
$strRu=array("января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря");
echo str_replace($strEng,$strRu,$date);?></span>
Вопрос:
Как сделать, чтобы всю дату словами?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.06.2022, 18:23
Ответы с готовыми решениями:

Правильно отобразить дату
Здравствуйте! Я в программировании не сильно силен. Поэтому прошу помощи. На новостном сайте к странице полной новости, чтобы время у...

Как отобразить на графике все данные за определенную дату?
Здравствуйте, у меня есть код для линейного графика. Ось x-дата, но у меня для одной даты несколько записей, как сделать, чтобы...

Как отобразить дату в поле?
Crezy PHP, Скажите пожалуйста , нашел в книге код как отобразить дату в поле, но почему-то не работает. var fullDateTime = new Date(); ...

5
1548 / 1521 / 325
Регистрация: 03.10.2012
Сообщений: 1,551
13.06.2022, 18:52
elliconnon, заинтересовала ваша задача. Оказалось, что не так всё просто, потому-что велик и могучем русскому языка. В РНР я новичок. И вот что у меня получилось. Буду всем благодарен за конструктивную критику.
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<span style="color:#000000;font-family:Arial;font-size:21px;">
<?php
$inputDate = '2022-06-13';
 
echo get_date_to_string($inputDate);
 
function get_date_to_string($inpDate){
    return day_to_string($inpDate) . month_to_string($inpDate) . year_to_string($inpDate) . 'года ' . dayOfWeek($inpDate) ;
}
 
function day_to_string($inpDate){
    $day = getdate(strtotime($inpDate))[mday];
 
    $ones = array('','первое ','второе ','третье ','четвёртое  ','пятое ','шестое ','седьмое ','восьмое ','девятое ');
    $tens0 = array('','','двадцать ','тридцать ');
    $tens = array('','десятое ','двадцатое ','тридцатое ');
    $teens = array('','одинадцатое ','двенадцатое ','тринадцатое ','четырнадцатое ','пятнадцатое ','шестнадцатое ','семнадцатое ','восемнадцатое ','девятнадцатое ');
 
    switch ($day) {
        case $day < 10:
            return $ones[$day];
            break;
        case $day > 10 and $day < 20:
            return $teens[substr($day,1,1)];
            break;
        case $day == 10 or $day == 20 or $day == 30:
            return $tens[substr($day,0,1)];
            break;
        case $day > 20:
            return $tens0[substr($day,0,1)] . $ones[substr($day,1,1)];
            break;
    }
}
 
function dayOfWeek($inpDate){
    $arrDays = array('воскресенье', 'понедельник', 'вторник', 'среда','четверг', 'пятница', 'суббота' );
    $dayOfWeek = getdate(strtotime($inpDate))[wday];
    return $arrDays[$dayOfWeek];
 
}
 
function month_to_string($inpDate){
    $arrMonth=array('',"января","февраля","марта","апреля","мая","июня ","июля","августа","сентября","октября","ноября","декабря");
    $mon = getdate(strtotime($inpDate))[mon];
    return  $arrMonth[$mon] . ' ';
}
 
function year_to_string($inpDate){
    $year = getdate(strtotime($inpDate))[year];
    $strOne = '';
    $arrTeens = [];
    $arrTens = array('','','двадцать ','тридцать ','сорок ','пятьдесят ','шестьдесят ','семьдесят ','восемьдесят ','девяносто ');
    $arrTens0 = [];
    $arrFour = array('','первого ','второго ','третьего ','четвертого ','пятого ','шестого ','седьмого ','восьмого ','девятого ');
 
    if (substr($year,2,1) == 1) {
        $arrTeens = array('','одинадцатого ','двенадцатого ','тринадцатого ','четырнадцатого ','пятнадцатого ','шестнадцатого ','семнадцатого ','восемнадцатого ','девятнадцатого ');
        $arrFour = [];
    }
 
    if (substr($year,3,1) == 0) {
        $arrTens0 = array('','десятого ','двадцатого ','тридцатого ','сорокового ','пятидесятого ','шестидесятого ','семидесятого ','восемидесятого ','девяностого ');
        $arrTens = [];
        $arrFour = [];
    }
 
    switch ($year) {
        case ($year > 2000 and $year < 2038):
            $strOne = 'две тысячи ';
            break;
        case ($year < 2000 and $year > 1901):
            $strOne = 'одна тысяча девятьсот ';
            break;
        case ($year == 2000):
            $strOne = 'двухтысячного ';
            break;
        default:
            $strOne = '';
        break;
    }
 
    return $strOne . $arrTeens[substr($year,3,1)] . $arrTens[substr($year,2,1)] .$arrTens0[substr($year,2,1)] . $arrFour[substr($year,3,1)];
}
 
?>
 
</span>
0
0 / 0 / 0
Регистрация: 09.06.2022
Сообщений: 2
13.06.2022, 21:25  [ТС]
Огромное спасибо за выдающийся ответ.
(в интернете, ничего подобного не существует)
****
Кроме того позволяет использование $_POST('id')
Всё прекрасно работает и ошибок вроде не выдаёт.
Очень нужный tool, поэтому ещё раз огромное спасибо.
****
Ваше PHP программирование для меня от слова "недосягаемо"
в плане, что мне бы хотелось также научиться, но с вашей помощью,
многое "недосягаемое" становится "досягаемым" уже сейчас.
0
1548 / 1521 / 325
Регистрация: 03.10.2012
Сообщений: 1,551
14.06.2022, 10:37
elliconnon, спасибо за добрые слова, но имейте ввиду, что этот код ещё очень сырой и к боевому применению не готов:
1. Надо сделать проверки на валидность даты.
2. Желательно оформить это всё в виде класса.
3. Функция getdate работает корректно в диапазоне 1970 - 2038 г.г. Поэтому, если вам нужно обрабатывать другие даты, то придётся парсить их вручную, а это совсем другой подход.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
14.06.2022, 19:23
Цитата Сообщение от elliconnon Посмотреть сообщение
Всё прекрасно работает и ошибок вроде не выдаёт.
https://onlinephp.io/c/f9f60
Цитата Сообщение от elliconnon Посмотреть сообщение
мне бы хотелось также научиться
То что MrCrown, решил задачу, он безусловно молодец, но данный код имеет множество проблем, стремиться к такому не стоит.
1
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
14.06.2022, 20:27
Мой вариант:
1) Создаем файл dictionary.php с содержимым:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
 
return [
    'bases' => [
        [
            1 => 'перв',
            2 => 'втор',
            3 => 'трет',
            4 => 'четвёрт',
            5 => 'пят',
            6 => 'шест',
            7 => 'седьм',
            8 => 'восьм',
            9 => 'девят',
            10 => 'десят',
            11 => 'одиннадцат',
            12 => 'двеннадцат',
            13 => 'тринадцат',
            14 => 'четырнадцат',
            15 => 'пятнадцат',
            16 => 'шестнадцат',
            17 => 'семнадцат',
            18 => 'восеминадцат',
            19 => 'девятнадцат'
        ],
        [
            2 => ['двадцат', 'двадцать'],
            3 => ['тридцат', 'тридцать'],
            4 => ['сороков', 'сорок'],
            5 => ['пятидесят', 'пятьдесят'],
            6 => ['шестидесят', 'шестьдесят'],
            7 => ['семидесят', 'семьдесят'],
            8 => ['восьмидесят', 'восемьдесят'],
            9 => ['девяност', 'девяносто']
        ],
        [
            1 => ['сот', 'сто'],
            2 => ['двухсот', 'двести'],
            3 => ['трёхсот', 'триста'],
            4 => ['четырёхсот', 'четыреста'],
            5 => ['пятисот', 'пятсот'],
            6 => ['шестисот', 'шестьсот'],
            7 => ['семисот', 'семьсот'],
            8 => ['восьмисот', 'восемьсот'],
            9 => ['девятисот', 'девятьсот'],
        ],
        [
            1 => ['однатысячн', 'одна тысяча'],
            2 => ['двухтысячн', 'две тысячи'],
            3 => ['трёхтысячн', 'три тысячи'],
            4 => ['четырёхтысячн', 'четыре тысячи'],
            5 => ['пятитысячн', 'пять тысяч'],
            6 => ['шеститысячн', 'шесть тысяч'],
            7 => ['семитысячн', 'семь тысяч'],
            8 => ['восьмитысячн', 'восемь тысяч'],
            9 => ['девятитысячн', 'девять тысяч']
        ]
    ],
    'endings' => [
        ['ый', 'ая', 'ое', 'ого', 'ой'],
        2 => ['ой'],
        3 => ['ий', 'ья', 'ье', 'ьего', 'ьей'],
        6 => ['ой'],
        7 => ['ой'],
        8 => ['ой'],
    ]
];

Затем создаем такой класс:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class NumberToWords
{
    private array $dictionary = [];
    
    public function __construct(string $dictionaryPath)
    {
        $this->loadDictionary($dictionaryPath);
    }
    
    public function translate(string $input, int $type): string
    {
        $output = '';
        $start  = strlen($input) - 1;
        
        for ($i = $start; $i >= 0; $i--) {
            $number = $input[$i];
 
            if ($start > 0 && $start === $i && '1' === $input[$i - 1]) {
                $number = "1{$number}";
            }
            
            $word = $this->getBase(abs($i - $start), $number);
            
            if (null !== $word) {
                if (is_array($word)) {
                    $word = $word[$output === '' ? 0 : 1];
                }
                
                if ('' === $output) {
                    $word .= $this->getEnding($number, $type);
                }
                
                $output = sprintf('%s %s', $word, $output);
            }
        }
        
        return chop($output);
    }
    
    private function getBase(int $group, int $number): string|array|null
    {
        return $this->dictionary['bases'][$group][$number] ?? null;
    }
    
    private function getEnding(int $number, int $type): string
    {
        $endinds = array_replace(
            $this->dictionary['endings'][0],
            $this->dictionary['endings'][$number] ?? []
        );
        
        return $endinds[$type];
    }
    
    private function loadDictionary($path): void
    {
        if (!is_readable($path)) {
            throw new RuntimeException('The dictionary path is incorrect.');
        }
        
        $this->dictionary = require $path;
    }
}

Используем так:
PHP
1
2
3
4
# Укажите правильный путь к dictionary.php
$translator = new NumberToWords(__DIR__ . '/dictionary.php');
 
echo $translator->translate(1986, 3); // одна тысяча девятьсот восемьдесят шестого
Есть варианты окончаний:
PHP
1
2
3
echo $translator->translate(1987, 3); // одна тысяча девятьсот восемьдесят седьмого
echo $translator->translate(1987, 1); // одна тысяча девятьсот восемьдесят седьмая
echo $translator->translate(28, 2); // двадцать восьмое
Выбор типа окончания лучше переделать в enum, конечно.

Работает с числами от 1 до 9999:
PHP
1
2
3
echo $translator->translate(1, 3); // первого
echo $translator->translate(9999, 3); // девять тысяч девятьсот девяносто девятого
echo $translator->translate(9000, 3); // девятитысячного
Можно увеличить диапазон, несколько доработав код.

Добавлено через 6 минут
Подредактировал комментарий.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.06.2022, 20:27
Помогаю со студенческими работами здесь

Как отобразить дату в ДБГриде в нужном формате?
В delphi поле время (из Access) выводит в неправильном формате. Через adoquery беру из БД (Access) поле &quot;время&quot;. В аксессе у...

Как отобразить дату вместе со временем на стандартных часах
Дома под временем отображается дата. А на рабочем компе - только время. Как включить эту настройку?

Как отобразить дату изменения документа в таблице эксель
Добрый день, возник следующий вопрос: Есть некоторый список журналов работ заполняемых в ворде. Возможно ли привязать к ячейке в экселе...

Как отобразить дату в конкретном формате с вычетом одного месяца?
Есть конкретный формат отображения даты: Format(Now, &quot;MMMM yyy&quot;) Как отобразить этот формат с вычетом одного месяца? К примеру,...

Вывести на экран заданную дату, написав месяц прописью
Ввести дату, в цифровом виде. Вывести на экран ее изменив цифры месяца на буквы. Например 01.09.2003 на 01 сентября 2003 procedure...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru