Отображение правильного формата даты в зависимости от культуры - PullRequest
4 голосов
/ 01 мая 2009

Я использую элемент управления для выбора даты во всплывающем календаре. Это использует функцию JavaScript, SetText, чтобы установить текстовое поле на заданную дату. Я ничего не могу изменить в самом элементе управления календаря, но я могу переопределить функцию SetText. Javascript SetText просто принимает имя TextBox и значение даты в строковом формате и устанавливает TextBox в строку.

Проблема: Мне нужно отобразить дату в формате «30 апреля».

Легко сделать. Используйте getMonth () и getDate (), где я могу анализировать информацию оттуда.

Теперь мне нужно убедиться, что это верно для разных культур. Например, в Великобритании даты указаны как «30 апреля». Поскольку программный код (c #) может отправлять дату в формате Великобритании, как я узнаю в JavaScript, что они используют Великобританию (дд / мм / гггг), а не США (мм / дд / гггг)?
Язык браузера навигатора может быть установлен на один параметр, а сервер настроен на другой, что может вызвать 4 января как несоответствие 1 апреля.

Ответы [ 8 ]

4 голосов
/ 24 июля 2009

Вы используете Microsoft Ajax Framework, эта платформа определяет набор « клиентских расширений типов », которые предоставляют добавленные функции или «расширения» для базовых типов JavaScript.

Расширения типа даты - это то, что вы ищете, в частности, функция Date.parseLocale .

С помощью этой функции вы можете анализировать строку, используя заданный формат.

Вы можете синхронизировать свою серверную и клиентскую культуру, задав для свойства ScriptManager.EnableScriptGlobalization значение true и использовать функцию Date.parseLocale без указания какого-либо формата.

Посмотрите на эту статью:

2 голосов
/ 26 июля 2009

Если вы контролируете серверную часть, почему бы просто не отправить временную метку и вставить ее в Date объект?

Что касается форматирования на стороне клиента, так как я уже использовал Dojo, я решил эту проблему с помощью dojo.date.locale.format. Это было совершенно безболезненно.

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

Учебник: http://docs.dojocampus.org/dojo/date/locale
API документация: http://api.dojotoolkit.org/jsdoc/1.3/dojo.date.locale.format
Описания формата даты: http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns

2 голосов
/ 01 мая 2009

См. toLocaleString и связанные с ними функции.

1 голос
/ 30 июля 2009

Библиотека JavaScript с открытым исходным кодом Date.js имеет несколько отличных методов для форматирования дат, а также поддерживает несколько языков:

Date.js в Google Code: http://code.google.com/p/datejs/

Если вы хотите красиво отформатировать дату / время, вы можете просто передать строку форматирования (почти идентичную используемой в .NET Framework) в метод .toString() любого объекта Date.

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

Если вы хотите управлять этим самостоятельно (как мы делаем в наших приложениях), вы можете найти ресурсы, которые предоставляют вам список соответствующих строк ресурсов для данной культуры. Вот тот, который показывает правильные строки форматирования для тонны культур: http://www.transactor.com/misc/ranges.html

1 голос
/ 25 июля 2009

toLocaleDateString будет лучшим решением, чем toLocaleString для вашей проблемы, поскольку оно не включает время (поскольку вы запрашиваете только дату).

1 голос
/ 05 мая 2009

Три вещи, которые вы могли бы использовать:

1) toLocaleString - Как уже предлагалось. Проблема в том, что при отправке строки "01.04.2009" это может привести к нескольким вещам. 4 января или 1 апреля.

2) navigator.language и navigator.systemLanguage - После получения строки даты вы можете проверить, на каком языке работает система, и проанализировать дату оттуда. Проблема с этим и решением 1 заключается в том, что если у вас есть сервер в Великобритании, а машина браузеров - США. У вас будет код отправки 1 апреля от 04.01.2009, где javascript будет читать строку на любом языке, на котором работают клиенты. Таким образом, сервер в Великобритании и браузер в США приведут к неверному результату.

3) Использование кода за культурой - создайте в своем javascript переменную, которая при загрузке страницы будет вызывать функцию в вашем коде, которая возвращает оттуда this.Page.Culture, и вы будете знать, какую культуру отправляется строка как. Это устранит несоответствие, которое могут быть вызваны первыми двумя решениями. Чтобы убедиться, что он отображается правильно, потребуется немного больше работы, но, по крайней мере, вы сможете использовать строку без возможности несовпадения культур.

0 голосов
/ 14 октября 2009

Я решил эту проблему, используя Datejs как

  • В codebehind (aspx.cs) я получаю культуру для сотрудника и добавляю соответствующие js в заголовок как

путь строки = «http://datejs.googlecode.com/svn/trunk/build/date-" + GetCulture () + ".js"; Helper.AddJavaScript (this, path);

(в вашем случае вы можете получить культуру из navigator.systemLanguage (или navigator.browserLanguge и т. Д.) И добавить тег заголовка в заголовок с атрибутом src, указывающим на соответствующий путь)

  • На стороне клиента я использую

d.toString (Date.CultureInfo.formatPatterns.shortDate)

где d - любой объект даты (Я попытался использовать Date.today (). ToShortDateString (), но он вызывал исключение. (Объект JSON CultureInfo имел структуру, отличную от ожидаемой функцией).

0 голосов
/ 28 июля 2009

Поскольку вы используете ASP.NET, возможно, вы также используете ASP.NET Ajax. Если это так, в ScriptManager есть два свойства, которые вам пригодятся:

EnableScriptLocalization - Получает или задает значение, указывающее, отображает ли элемент управления ScriptManager локализованные версии файлов сценариев.

EnableScriptGlobalization - Получает или задает значение, указывающее, отображает ли элемент управления ScriptManager сценарий, поддерживающий анализ и форматирование информации, относящейся к культуре.

<asp:ScriptManager ID="AjaxManager" runat="Server" EnablePartialRendering="true"
            EnableScriptGlobalization="true" EnableScriptLocalization="true" />

Когда вы включаете оба из них (значение true), расширители ASP.NET Ajax и т. Д. Должны автоматически локализироваться в культуре, указанной в web.config:

<configuration>
  <system.web>
    <globalization 
       fileEncoding="utf-8" 
       requestEncoding="utf-8" 
       responseEncoding="utf-8" 
       culture="en-GB" 
       uiCulture="en-GB" />  
  </system.web>
</configuration>

Например, установка этого параметра приведет к локализации AjaxControlToolkit Calendar в вашей конкретной культуре.

Даже если вы НЕ используете ASP.NET Ajax, добавление ScriptManager и включение локализации даст вам полезную переменную javascript с именем __cultureInfo, которая содержит массив локализованных форматов JSON, например, валюты, даты и т. Д.

"CalendarType":1,"Eras":[1],"TwoDigitYearMax":2029,"IsReadOnly":true},"DateSeparator":"/","FirstDayOfWeek":1,"CalendarWeekRule":0,"FullDateTimePattern":"dd MMMM yyyy HH:mm:ss","LongDatePattern":"dd MMMM yyyy","LongTimePattern":"HH:mm:ss","MonthDayPattern":"dd MMMM","PMDesignator":"PM","RFC1123Pattern":"ddd, dd MMM yyyy HH\u0027:\u0027mm\u0027:\u0027ss etc....
...