Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Узнать дату имея номер недели, год и полное название дня
 
 автор: SeletSKY   (21.02.2013 в 13:02)   письмо автору
 
 

Добрый день! Подскажите пожалуйста, как узнать дату формата (21-02-2013) зная номер недели (8), год и полное название дня (Monday) если такое возможно

  Ответить  
 
 автор: Valick   (21.02.2013 в 13:15)   письмо автору
 
   для: SeletSKY   (21.02.2013 в 13:02)
 

возможно
вот только при каких обстоятельствах возникла такая задача?
откуда поступают данные и куда сохраняются?
(файл -> файл, база -> файл, файл -> база или база -> база)
или это парсер и вы тырите контент без зазрения совести? :)

  Ответить  
 
 автор: confirm   (21.02.2013 в 13:53)   письмо автору
 
   для: SeletSKY   (21.02.2013 в 13:02)
 

Понедельник восьмой недели года текущего, это 18 число, а не 21. Если вы упоминаете 21, значит это уже относительная дата будет.

  Ответить  
 
 автор: Igorek   (21.02.2013 в 13:53)   письмо автору
 
   для: SeletSKY   (21.02.2013 в 13:02)
 

Вот можно так. вроде даже правильно))

<?php
// исходные данные
$num_of_week 8;
$year date("Y");
$day_name 'Monday';


$days = array(
    
'monday' => 1,
    
'tuesday' => 2,
    
'wednesday' => 3,
    
'thursday' => 4,
    
'friday' => 5,
    
'saturday' => 6,
    
'sunday' => 7
);
$num_of_week sprintf("%02d"$num_of_week);
$num_of_day $days[strtolower($day_name)];

echo 
strftime('%d-%m-%Y',strtotime($year."-W".$num_of_week."-".$num_of_day));


может есть лучше вариант? Или как хотя бы получить номер дня недели без использования массива?

  Ответить  
 
 автор: confirm   (21.02.2013 в 13:55)   письмо автору
 
   для: Igorek   (21.02.2013 в 13:53)
 

strtotime() для этого есть.

  Ответить  
 
 автор: Igorek   (21.02.2013 в 13:59)   письмо автору
 
   для: confirm   (21.02.2013 в 13:55)
 

strtotime возвращает timestamp, а мне нужен порядковый номер дня недели по его названию. Или как?


UPD
видимо так:

<?php
echo strftime("%u",strtotime('Tuesday'));

  Ответить  
 
 автор: Igorek   (21.02.2013 в 14:03)   письмо автору
 
   для: Igorek   (21.02.2013 в 13:53)
 

с учетом новых данных:


<?php
// исходные данные 
$num_of_week 8;
$year date("Y");
$day_name 'friday';

$num_of_week sprintf("%02d"$num_of_week);
$num_of_day strftime("%u",strtotime($day_name));

echo 
strftime('%d.%m.%Y',strtotime($year."-W".$num_of_week."-".$num_of_day));

  Ответить  
 
 автор: confirm   (21.02.2013 в 14:05)   письмо автору
 
   для: Igorek   (21.02.2013 в 14:03)
 

http://www.php.net/manual/ru/datetime.formats.php

  Ответить  
 
 автор: Igorek   (21.02.2013 в 16:04)   письмо автору
 
   для: confirm   (21.02.2013 в 14:05)
 

Для решения вопроса ТС я использую формат(наиболее подходящий в данном случае) YY "-"? "W" W "-"? [0-7] (Год, неделя в формате ISO и день недели) http://www.php.net/manual/ru/datetime.formats.compound.php
Соответственно из исходных данных мне нужно получить только номер дня недели по его имени, что я и сделал:

<?php
$num_of_day 
strftime("%u",strtotime($day_name));


Собственно, что вы хотели сказать? можно проще или я что-то неправильно делаю?
Хотя бы ткните носом куда именно в мануале смотреть, иначе не догоняю))

  Ответить  
 
 автор: confirm   (21.02.2013 в 16:14)   письмо автору
 
   для: Igorek   (21.02.2013 в 16:04)
 

Вы спрашивали можно ли проще, приводя свой громоздкий пример. Вот к тому и ссылка о форматах представления даты для strtotime(), которая и позволяет избежать этих сложностей.

  Ответить  
 
 автор: Igorek   (21.02.2013 в 16:19)   письмо автору
 
   для: confirm   (21.02.2013 в 16:14)
 

т.е. последний вариант можно считать оптимальным? я думал критика к нему относится

  Ответить  
 
 автор: SeletSKY   (21.02.2013 в 16:49)   письмо автору
 
   для: Igorek   (21.02.2013 в 16:19)
 

Спасибо! Всем спасибо ребят, реально выручили.. я тут другим был запарен, а Вы тут готовое решение накатали! Всем пива!)))

  Ответить  
 
 автор: confirm   (21.02.2013 в 17:12)   письмо автору
 
   для: Igorek   (21.02.2013 в 16:19)
 

Ну вы же читали о функции strtotime(), которая разбирает английское строковое представления даты/времени, формат которой и описан по ссылке. А из этого материла ясно, что ваши промежуточные вычисления $num_of_week и $num_of_day совсем не обязательно делать.

  Ответить  
 
 автор: Igorek   (21.02.2013 в 17:28)   письмо автору
 
   для: confirm   (21.02.2013 в 17:12)
 

Думается мне, что вы ошибаетесь. Я не зря привел пример выбранного формата (со страницы компоновки форматов):
YY "-"? "W" W "-"? [0-7], где YY - [0-9]{4}, W - "0"[1-9] | [1-4][0-9] | "5"[0-3]
т.е. номер недели обязательно число с с предшествующим нулем, если меньше 10, поэтому нужен sprintf. А номер дня недели - обязательно число от 0 до 7.

Т.о.
<?php 
echo strftime('%d.%m.%Y',strtotime("2013-W02-tuesday")); // некорректно (01.01.1970)
echo strftime('%d.%m.%Y',strtotime("2013-W2-2")); // некорректно (01.01.1970)
echo strftime('%d.%m.%Y',strtotime("2013-W02-2")); // корректно (08.01.2013)

  Ответить  
 
 автор: confirm   (21.02.2013 в 17:37)   письмо автору
 
   для: Igorek   (21.02.2013 в 17:28)
 

Это вы ошибаетесь, ибо совсем не обязательно указывать тот формат, который вы представляете, можно и так написать:
<?
echo date("d-m-Y"strtotime('second day 2013-01-01 +7 weeks'));

А можно и по другому, почитайте в руководстве. Вот только что за дату все таки надо, это вопрос, ибо понедельник восьмой недели никак не 21, уж тем более не 08.01.2013.

  Ответить  
 
 автор: Igorek   (21.02.2013 в 18:43)   письмо автору
 
   для: confirm   (21.02.2013 в 17:37)
 

> уж тем более не 08.01.2013
мой последний пример был не для вычисления даты понедельника восьмой недели

> echo date("d-m-Y", strtotime('second day 2013-01-01 +7 weeks'));
Если бы это выражение вычисляло второй день недели от (2013-01-01 +7 weeks) - было бы интересно (хотя здесь и нет названия дня недели, что является исходным условием), но это не так.

> А можно и по другому, почитайте в руководстве
Вполне возможно, что возможно. Вот только я пока не вижу другого решения. Рукодство читаю и перечитываю - не помогает. Будьте так добры - приведите пример, ибо действительно интересно)

  Ответить  
 
 автор: confirm   (21.02.2013 в 20:02)   письмо автору
 
   для: Igorek   (21.02.2013 в 18:43)
 

Я вам уже привел пример, а в руководстве масса определений, именно по ним strtitime() разбирает английскую нотацию строкового представления даты. Так что пробуйте, лучше усвоите. )
Но это второстепенное, ибо никто не запрещает делать так, как вы делали. А вот первичное так и осталось не понятным и без ответа - говорят о понедельнике, а, судя по дате, хотят совсем не этот день. Так что не понять, то-ли от первого дня года (а это был вторник), второй день недели (в английской нотации это и есть понедельник), что и есть в моем примере, и чего вроде бы хотят. То-ли действительно нужен понедельник.
Не понять, а ребусы решать я не хочу. )

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования