Как изменить DayOfWeek(), чтобы начать с собственного дня

Я хочу изменить функцию DayOfWeek(), чтобы я мог получать даты в соответствии с желаемым первым днем ​​недели. Итак, что я делаю в этом коде, так это то, что я устанавливаю startDate, endDate и selectDays, которые я хочу проверить. Вот мой код:

<cfscript>

function Mydayofweek(date, day_1)
{   
    return (((DayOfWeek(date) + (7 -day_1)) MOD 7) +1);
}

</cfscript>

<cfset startDate = '07/01/2013'>
<cfset endDate = '07/25/2013'>
<Cfset mydates = ''>
<cfset selectDays = '2,6'>

<cfset MyWeekFirstDay = 6> <!---I selected Friday = 6 --->
<cfset new = ''>

<cfoutput>
    <cfloop list="#selectDays#" delimiters="," index="d">
        <cfset new &=  '#Mydayofweek(d, MyWeekFirstDay)#,' >
    </cfloop>


<cfif new NEQ ''>
    <cfset ScheduleDate = left(new, (len(new)-1) )>
</cfif>

<cfdump var="#ScheduleDate#"><br />
</cfoutput>
<cfset AppendToMyDates = false>
 <cfloop from="#startDate#" to="#endDate#" index="day">
 <cfif AppendToMyDates is false and DayOfWeek(day) is ListFirst(selectDays)>
 <cfset AppendToMyDates = true>
 </cfif>

    <cfif listfind(ScheduleDate, DayOfWeek(day), ',') NEQ 0 and AppendToMyDates is true>

      <cfset mydates &= "#dateformat(day, 'mmm, dd, yyyy dddd')#,<br />">

    </cfif>
    </cfloop><cfoutput>#mydates#</cfoutput> 

Это написано в ColdFusion. Этот код генерирует этот вывод:

4,1
Jul, 03, 2013 Wednesday,
Jul, 07, 2013 Sunday,
Jul, 10, 2013 Wednesday,
Jul, 14, 2013 Sunday,
Jul, 17, 2013 Wednesday,
Jul, 21, 2013 Sunday,
Jul, 24, 2013 Wednesday,

Вывод должен быть таким, потому что я выбираю пятницу = 1 по четверг = 7, поэтому указанные выше дни selectDays = '2,6' теперь должны указывать на selectDays = '7,4' по отношению к моим первым дням 2,6

7,4
Jul, 06, 2013 Saturday,
Jul, 10, 2013 Wednesday,
Jul, 13, 2013 Saturday,
Jul, 17, 2013 Wednesday,
Jul, 20, 2013 Saturday,
Jul, 24, 2013 Wednesday,

Я установил selectDays = '2,6', это означает, что я хочу получить даты Saturday и Wednesday, потому что я установил 6 в качестве первого дня недели, и он начинается с пятницы (по умолчанию это было воскресенье). Мои дни начинаются с воскресенья Sunday = 1 , Monday = 2 , Tuesday = 3 , Wednesday = 4 , Thursday = 5 , Friday = 6 , Saturday = 7, и теперь я изменил начало даты с Friday = 1 , Saturday = 2 ,Sunday = 3 , Monday = 4 , Tuesday = 5 , Wednesday = 6 , Thursday = 7 в функции скрипта. На самом деле я думаю, что в моей функции сценария есть ошибка, которую я не понимаю. Пожалуйста, помогите мне найти проблему и ее решение, спасибо

ОБНОВЛЕНО


person Azam Alvi    schedule 26.06.2013    source источник
comment
Я понимаю, о чем вы говорите, но изменение поведения функции DayOfWeek() не поможет вам достичь цели. По сути, вам нужно добавить некоторую логику if/else внутри вашего цикла, чтобы не записывать среду в вашу переменную mydates, если она пуста.   -  person Dan Bracuk    schedule 26.06.2013
comment
Первым днем ​​DayOfWeek уже является воскресенье: порядковый номер дня недели в виде целого числа в диапазоне от 1 (воскресенье) до 7 (суббота). Не уверен, почему вы хотите изменить его функциональность в этом случае.   -  person duncan    schedule 26.06.2013
comment
@DanBracuk, не могли бы вы сказать мне, какое будет правильное условие if/else?   -  person Azam Alvi    schedule 26.06.2013
comment
Я все еще думаю, что вы слишком усложняете свою проблему. Не беспокойтесь об изменении значений дня по умолчанию. Ваш код может обрабатывать выбор пользователя, а затем за кулисами устанавливать для функции соответствующее значение. Если пользователь хочет, чтобы его неделя начиналась во вторник, просто пусть ваш код сделает для него соответствующий выбор из 3. Я не думаю, что вам действительно нужно менять функциональность в противном случае.   -  person Miguel-F    schedule 26.06.2013


Ответы (3)


Вам просто нужно вызвать свой скрипт в свой цикл. Не нужно создавать какую-либо функцию, просто измените код, подобный этому. Скопируйте этот код, надеюсь, это решит вашу проблему.

<cfscript>
  function Mydayofweek(date, day_1)
  {   
     return (((DayOfWeek(date) + (7 -day_1)) MOD 7) +1);
  } 
</cfscript>

<cfset startDate = '07/01/2013'>
<cfset endDate = '07/25/2013'>
<Cfset mydates = ''>
<cfset selectDays = '2,6'>
<cfset MyWeekFirstDay = 6><!---I selected Friday = 6 --->


<cfloop from="#startDate#" to="#endDate#" index="day">
  <cfif listfind(selectDays, Mydayofweek(day,MyWeekFirstDay), ',') NEQ 0 >
    <cfset mydates &= "#dateformat(day, 'mmm, dd, yyyy dddd')#,<br />">
  </cfif>
</cfloop>
<cfoutput>#mydates#</cfoutput> 
person Community    schedule 27.06.2013

С новой информацией о том, что selectDays может не всегда совпадать, я бы сделал что-то вроде этого:

<cfset AppendToMyDates = false>
 <cfloop from="#startDate#" to="#endDate#" index="day">
 <cfif AppendToMyDates is false and DayOfWeek(day) is ListFirst(SelectDays)>
 <cfset AppendToMyDates = true>
 </cfif>

    <cfif listfind(selectDays, DayOfWeek(day), ',') NEQ 0 and AppendToMyDates is true>
      <cfset mydates &= "#dateformat(day, 'mmm, dd, yyyy dddd')#,<br />">
    </cfif>
  </cfloop>

Правка начинается здесь

Если вы хотите, чтобы начало недели было переменной, вам нужно написать собственную версию DayOfWeek() с другим именем. Структура будет примерно такой:

<cffunction name="DayOfWeekModified returntype="numeric">
<cfargument name="WeekStartsOn" type="numeric" required="yes">
<cfscript>
var DayNumber = 0;
code to generate it based on arguments.WeekStartsOn
return DayNumber;
<cfscript>
<cffunction>

Затем вы вызываете эту функцию вместо DayOfWeek() в своем цикле.

person Dan Bracuk    schedule 26.06.2013
comment
логическое значение необходимо? Почему бы просто не поставить DayOfWeek(day) is ListFirst(SelectDays) во втором операторе if вместо and? - person Matt Busche; 26.06.2013
comment
Если бы я это сделал, я думаю, что это никогда не добавило бы значения для второго элемента списка. - person Dan Bracuk; 27.06.2013
comment
@DanBracuk спасибо, ваш ответ немного помогает мне решить мою проблему - person Azam Alvi; 27.06.2013

Проблема, с которой вы столкнулись, связана с вашим состоянием cfif. Вы перебираете даты, а затем проверяете, является ли данная дата средой или пятницей, и результаты, которые вы получаете, верны. Поскольку вы хотите начать с пятницы (игнорируя первую среду), вам нужно добавить это в свой код. Это может сработать для вас:

<cfset startDate = '06/11/2013'>
<cfset endDate = '06/25/2013'>
<cfset mydates = ''>
<cfset selectDays = '6,4'>

<cfloop from="#startDate#" to="#endDate#" index="day">
    <cfif listfind(selectDays, DayOfWeek(day), ',') NEQ 0>
        <cfif mydates NEQ "" OR DayOfWeek(day) EQ "6">
            <cfset mydates &= "#dateformat(day, 'mmm, dd, yyyy dddd')#,<br />">
        </cfif>
    </cfif>
</cfloop>
<cfoutput>#mydates#</cfoutput> 

Я добавил дополнительное условие cfif вокруг настройки mydates. Этот код mydates NEQ "" проверяет, не является ли mydates пустым, то есть мы уже выполнили следующее условие. Если mydates пусто, проверьте также, является ли данная дата пятницей с DayOfWeek(day) EQ "6". Это должно гарантировать, что первая дата, введенная в mydates, будет пятницей.

Не уверен, как я отношусь к этому коду, но, похоже, он сработал для меня с вашим примером.

person Miguel-F    schedule 26.06.2013
comment
это работает в случае, если я даю <cfset selectDays = '2,3'> тогда это терпит неудачу - person Azam Alvi; 26.06.2013
comment
Это правильно. Вот почему мне не нравится это решение. Вам нужно будет изменить код для разных дней. Просто измените условие DayOfWeek(day) EQ "6" на первый день недели, с которого вы хотите начать. Поэтому вместо "6" для пятницы измените на "2" для понедельника и т. д. - person Miguel-F; 26.06.2013
comment
на самом деле я хочу сказать, что хочу исправить свой начальный день недели, а затем в соответствии с этим днем ​​​​исправления я хочу отобразить свою дату. например, сегодня день начала недели 06/23/2013 Sunday, и я хочу узнать, что мой желаемый день <selectDays = '2,3'>, это означает Saturday and Sunday в соответствии с моим фиксированным днем. Теперь мои дни будут начинаться с friday = 1 по Thursday = 7, так что это моя настоящая проблема. - person Azam Alvi; 26.06.2013
comment
Я понимаю меньше, чем раньше, но вы все равно не хотите менять нативную функцию cf. Может быть, определяемая пользователем функция - это путь. - person Dan Bracuk; 26.06.2013
comment
@AzamAlvi - боюсь, я тоже не понимаю ваш последний комментарий? Я не думаю, что вы можете изменить начальный день недели для встроенных функций ColdFusion; 1 = воскресенье. Так что вам нужно будет работать с этим. Я не понимаю, почему ты постоянно меняешь selectDays? Кажется, что даже ваш собственный день начала недели меняется? - person Miguel-F; 26.06.2013
comment
@ Miguel-F Я разрабатываю календарь, в котором пользователь может изменить свой начальный день недели, и я хочу изменить эту функцию. - person Azam Alvi; 26.06.2013
comment
@AzamAlvi - Спасибо за объяснение. Похоже, Дэн развил мой пример немного дальше и заставил его работать с любыми значениями, которые есть в вашем списке selectDays. Похоже, его ответ сработает для вас. - person Miguel-F; 26.06.2013