




Я программирую на Visual Basic, поэтому знаю, как это делать на VB.NET. Прочтите дату XML в переменной (назовем ее SomeDate). Затем вы создаете новую дату, в которой знать является началом года, который содержит вашу неизвестную дату. Затем вы позволяете функции DateDiff делать свою работу и сообщать вам номер недели.
Dim SomeDate As Date = ReadDateFromXML()
Dim YearStart As New Date(Year(SomeDate), 1, 1)
Dim WeekNumber As Integer = DateDiff(DateInterval.WeekOfYear, YearStart, SomeDate)
И в C#:
DateTime date = DateTime.Now;
int week = date.DayOfYear / 7;
Console.WriteLine(week);
Расчет недели может быть довольно сложным, если вы всегда хотите, чтобы неделя начиналась в один и тот же день, потому что первый день года всегда меняется. Для его расчета существует стандарт ISO, см. эта статья в Википедии.
Я знаю об этом, но это не обязательно. Каждую неделю можно начинать с воскресенья или понедельника. Мне просто нужно рассчитать разницу между двумя датами (в неделях)
Если вы можете использовать EXSLT, есть несколько функций даты. Все они реализованы в Saxon, но если вы используете MSXSL, Крис Байес реализовал их как функции расширения, которые вы можете поместить в свое преобразование внутри элемента msxsl: script. Его реализации связаны с каждой конкретной страницы функции даты.
неделя в году () - это функция, которую вы ищете?
Редактировать: Согласно комментарию JeniT, на том же сайте доступен чистый шаблон XSLT 1.0 с той же функциональностью, что и week-in-year () (который, я думаю, она написала), что может лучше соответствовать вашим требованиям.
И если вы посмотрите на этот сайт, вы найдете чистый шаблон XSLT 1.0, который сделает это за вас: exslt.org/date/functions/week-in-year/…
Так что есть. Я пропустил это. Даже лучше.
Большое спасибо вам обоим. Это действительно хорошая реализация.
Ознакомьтесь с «Поваренной книгой XSLT» Сала Мангано. Что интересно, он доступен на Google Книги.
Способ xslt 2.0:
<xsl:function name = "chkbk:calculate-week-number" as = "xs:integer">
<xsl:param name = "date" as = "xs:date" />
<xsl:sequence select = "xs:integer(format-date($date,'[W]'))" />
</xsl:function>
Для способа 1.0 см. Предварительный просмотр Cookbox. Кстати, я просто погуглил xslt weeknumber, чтобы найти это.
Можете ли вы представить пример того, как двое используют эти функции, потому что мне кажется, что мне чего-то не хватает. Спасибо.
Перейдите по добавленной мной ссылке и выполните поиск в этой книге. Полный пример приведен на странице 143.
Формат даты должен быть '[W]' (в приведенном выше примере отсутствует закрывающая квадратная скобка).
Спасибо, я исправлю, когда Джефф вернет нам наши возможности редактирования.
Это чистое решение XSLT 1.0:
Можно использовать модуль таблицы стилей datetime_lib.xsl Мартина Роулинсона, который поставляется с XSelerator (хорошая XSLT IDE, недавно сделанная бесплатно на sourceforge). Вам нужно будет загрузить и установить это приложение, после чего вы найдете множество дополнительных библиотек и образцы передовых методов и решений.
Файл datetime_lib.xsl можно найти (для типичной установки) по адресу:
C: \ Program Files \ Marrowsoft \ Xselerator25 \ Samples \ Libraries \
Вот шаблон из этой библиотеки с именем «номер недели»:
<xsl:template name = "week-number">
<xsl:param name = "year"/>
<xsl:param name = "month"/>
<xsl:param name = "day"/>
<!-- or -->
<xsl:param name = "date" select = "''"/> <!-- format: yyyymmdd or yyyy-mm-dd -->
<!-- or -->
<xsl:param name = "julian-day" select = "''"/>
<!-- trim down date -->
<xsl:variable name = "tdate" select = "translate($date,'-','')"/>
<!-- decide which params were passed -->
<xsl:variable name = "yyyy">
<xsl:choose>
<xsl:when test = "string-length($date) > 0"><xsl:value-of select = "substring($tdate,1,4)"/></xsl:when>
<xsl:when test = "string-length($julian-day) > 0">
<xsl:variable name = "jdate">
<xsl:call-template name = "julian-day-to-date">
<xsl:with-param name = "julian-day" select = "$julian-day"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select = "substring($jdate,1,4)"/>
</xsl:when>
<xsl:otherwise><xsl:value-of select = "$year"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- get the julian day number -->
<xsl:variable name = "jd">
<xsl:choose>
<xsl:when test = "string-length($julian-day) > 0"><xsl:value-of select = "$julian-day"/></xsl:when>
<xsl:otherwise>
<xsl:call-template name = "date-to-julian-day">
<xsl:with-param name = "year" select = "$year"/>
<xsl:with-param name = "month" select = "$month"/>
<xsl:with-param name = "day" select = "$day"/>
<xsl:with-param name = "date" select = "$date"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- get the julian day number for the first working day of next year -->
<xsl:variable name = "fyjd">
<xsl:call-template name = "first-day-of-year">
<xsl:with-param name = "year" select = "$yyyy+1"/>
<xsl:with-param name = "as-julian-day" select = "true()"/>
</xsl:call-template>
</xsl:variable>
<!-- decide which the 'working' year for this date is -->
<xsl:variable name = "start-jd">
<xsl:choose>
<xsl:when test = "$jd >= $fyjd"><xsl:value-of select = "$fyjd"/></xsl:when>
<xsl:otherwise>
<xsl:call-template name = "date-to-julian-day">
<xsl:with-param name = "date">
<xsl:call-template name = "first-day-of-year">
<xsl:with-param name = "year" select = "$yyyy"/>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- final calc output -->
<xsl:value-of select = "floor(($jd - $start-jd) div 7) + 1"/>
</xsl:template>Вот простое преобразование XSLT с использованием шаблона "номер недели":
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl = "urn:schemas-microsoft-com:xslt">
<xsl:import href=
"C:\Program Files\Marrowsoft\Xselerator25\Samples\Libraries\datetime_lib.xsl"/>
<xsl:output method = "text"/>
<xsl:template match = "/">
<xsl:call-template name = "week-number">
<xsl:with-param name = "date" select = "'2008-11-16'"/>
</xsl:call-template>
</xsl:template>
</xsl:stylesheet>При применении к любому исходному XML-документу (не используется) получается желаемый результат:
46
Надеюсь, что на этот раз ответ был действительно более полезным.
Ваше здоровье,
Димитр Новачев.
Ссылка на XSelerator кажется устаревшей. Похоже, что он больше не доступен в свободном доступе. Кроме этого, следует проголосовать за отличное решение!
@Abel, К сожалению, XSelerator был удален его автором с sourceforge.net. Если вы свяжетесь с ним, он может предоставить вам постоянную лицензию - продукт все еще был бесплатным, и я помню, как кто-то связался с ним и получил XSelerator. Пожалуйста, свяжитесь со мной, если вам нужно это обсудить.
Это неверно ... Посмотрите, почему: social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/…