Pull to refresh

Форматирование даты по RFC-2822 для RSS в ASP-vbscript

Reading time 2 min
Views 2.3K
Настоящий текст не является призывом к использованию javascript, vb (чур меня), IIS, RSS, HTTP, TCP, IP и других нерусских слов, а описывает частное решение частной проблемы.

Довелось на днях привинчивать RSS для Яндекс-новостей к сайту на ASP (vbscript). Все, в общем-то, было просто, но нежданно-негаданно запнулся на ровном месте — форматировании даты. Дата (pubDate) должна быть в формате RFC-2822, причем в требованиях Яндекса указано, что время должно быть не UTC, а с правильным часовым поясом, соответствующим размещению ресурса. Например: Fri, 25 Dec 2009 09:24:44 -0300. Известное дело, vbscript сам c датой работать толком не умеет: знает полтора ущербных формата, да и те норовит по своей прихоти испохабить локализацией (сам был свидетелем случаев, когда при логине пользователя в консоль сервера IIS+ASP+vbscript хватал локаль зашедшего юзера, менял формат даты и всего остального, после чего приложение с грохотом валилось). Надо было сформатировать дату, не пользуясь медвежьими услугами барсика, и я пошел в Инет в рассуждении быстро нарыть подходящий код, а потом перейти к содержательной работе.
Щас!
Как это иногда (честно сказать, довольно часто) бывает, код нашелся, да не тот. Я сформатировал было дату (локаль 1033 пришлось приколотить гвоздями), но тут оказалось, что на vbscript никак не получить временную зону хоста. Опаньки. Ну не то, чтобы совсем никак. Нарыл в интернете аж целых 2 способа, один другого краше: первый через WMI, второй — через HTTP запрос к локальному серверу. Извращение натуральное. Если перестанет работать, замучаешься искать, почему сломалось. И тормозить будет, как два плавучих якоря. Короче, нельзя так делать, и все.

В конце концов нашелся хитроумный способ (на самом деле, многие советуют, например тут: http://ajaxandxml.blogspot.com/2006/02/computing-server-time-zone-difference.html): в страницу на vbscript делается вставка на javascript, который умнее барсика на порядок и худо-бедно умеет работать с датами. Это решило вопрос с часовым поясом (временной зоной), но все равно готового решения не нашлось, несколько строк пришлось сочинить. Потом еще немного поковырялся, чтобы работало для нецелых временных зон (говорят, такие бывают).
Получилось вот что:

<%@ LANGUAGE="VBSCRIPT" %>
<SCRIPT Language="JavaScript" Runat="Server">

function zeroPad(num, width) {
	num = num.toString();
	while (num.length < width) {
		num = "0" + num;
	}
	return num;
}

function fmtRssDate(dUTC){
	var offset = -((new Date()).getTimezoneOffset());
	
	var offsetH = Math.floor(Math.abs(offset) / 60);
	var offsetM = Math.abs(offset) - offsetH * 60;
	var sOffset = ((offset >= 0) ? "+" : "-") + zeroPad(offsetH, 2) + zeroPad(offsetM, 2);

	var localTime = new Date(dUTC - offset * 60000);
	var sLocalTimeWithOffset = localTime.toUTCString();
	sLocalTimeWithOffset = sLocalTimeWithOffset.substring(0, sLocalTimeWithOffset.indexOf("UTC"));
	sLocalTimeWithOffset += sOffset;

	return sLocalTimeWithOffset;
}

</SCRIPT>

<%=fmtRssDate(now())%>

Всё.
Tags:
Hubs:
-4
Comments 4
Comments Comments 4

Articles