Персидский календарь - дата вставки и извлечения в персидском формате из базы данных Oracle - PullRequest
0 голосов
/ 25 апреля 2018

Мое заявление требует следующего.

В моем приложении (в стойках) нам нужна поддержка персидского календаря.

Когда мы отправляем форму, дата становится строкой в ​​классе Action. Нам нужно сохранить эту дату в персидском формате в БД. Мы настроили БД для персидского календаря. И при получении данных из БД пользователь должен иметь возможность видеть дату только в персидском формате.

Также пользователь может переключаться на 2 языка (английский, персидский). Итак, приложение должно поддерживать оба типа календарей (григорианский и персидский). Если пользователь вошел в систему на английском языке, григорианский календарь должен быть виден. Если пользователь вошел в систему на персидском языке, то должен быть виден персидский календарь.

Для преобразования даты с григорианского на персидский я использую ниже: http://www.dailyfreecode.com/forum/converter-gregorian-date-jalali-date-20288.aspx

В приведенном выше требовании я сталкиваюсь с двумя проблемами:

  1. При отправке формы, как мы можем сохранить дату (в формате String в классе Action) в персидском формате в БД?
  2. При получении данных из БД они должны быть в персидском формате. На данный момент клиент JDBC получает дату в григорианском календаре.

Я передаю java.sql.Date (сегодняшнюю дату), которая сохраняется в персидском формате в БД. Используя код ниже.

java.sql.Date sqlDate = null; 
java.util.Date utilDate = new Date(); 
sqlDate = new java.sql.Date(utilDate.getTime()); 
PreparedStatement psmtInsert = conn.prepareStatement(insertQuery); 
psmtInsert.setDate(1, sqlDate)); 
psmtInsert.executeUpdate();

Для получения:

PreparedStatement psmtSelect = conn.prepareStatement("select dateOfJoining from EMPLOYEE");
ResultSet resultSet = psmtSelect.executeQuery();
while (resultSet.next()) {
    System.out.println(resultSet.getDate(1));
}

Но это возвращаемая дата по григорианскому типу.

Есть ли у нас какие-либо настройки в клиенте Tomcat / JVM / JDBC, которые преобразуют дату, возвращаемую из БД, в сам персидский формат (например, у нас есть NLS_CALENDAR, NLS_DATE_FORMAT в Oracle)?

Для 1-го выпуска, если я передаю дату в персидском формате, то в БД она сохраняется неправильно. PFB мой код:

java.sql.Date sqlDate = null; 
java.util.Date utilDate = new Date("1397/02/04"); 
sqlDate = new java.sql.Date(utilDate.getTime()); 
PreparedStatement psmtInsert = conn.prepareStatement(insertQuery); 
psmtInsert.setDate(1, sqlDate)); 
psmtInsert.executeUpdate();

Выше вставляется как 0777/09/13 в БД.

Как мы можем преодолеть вышеуказанные проблемы? Заранее спасибо.

1 Ответ

0 голосов
/ 25 апреля 2018

При отправке формы, как мы можем сохранить дату (которая в формате String в классе Action) в персидском формате в БД?

Сохранить дату как DATE данныевведите и, если вы хотите вставить его в таблицу, используйте TO_DATE с параметром календаря NLS для персидского языка, чтобы преобразовать его из строки в формате Persion в дату:

SQL Fiddle

Запрос 1 :

SELECT TO_DATE(
         '1397/02/05',
         'yyyy/mm/dd',
         'nls_calendar=persian'
       )
FROM   DUAL

Результаты :

| TO_DATE('1397/02/05','YYYY/MM/DD','NLS_CALENDAR=PERSIAN') |
|-----------------------------------------------------------|
|                                      2018-04-25T00:00:00Z |

При полученииданные из БД должны быть в персидском форматеНа данный момент клиент JDBC получает дату в григорианском календаре.

Когда вы выводите значение, просто укажите календарь, который вы хотите использовать для его форматирования.Поэтому для персидского языка используйте TO_CHAR с параметром календаря NLS для персидского языка:

Query 2 :

SELECT TO_CHAR(
         DATE '2018-04-25',
         'yyyy/mm/dd',
         'nls_calendar=persian'
       )
FROM   DUAL

Results :

| TO_CHAR(DATE'2018-04-25','YYYY/MM/DD','NLS_CALENDAR=PERSIAN') |
|---------------------------------------------------------------|
|                                                    1397/02/05 |

У нас есть какой-нибудь способ, с помощью которого клиент JDBC получает дату в персидском формате.

Это распространенное заблуждение.Тип данных DATE, хранящийся в таблицах Oracle в виде 7 байтов, содержащих год (2 байта), месяц, день, часы, минуты и секунды (по 1 байту каждый).У него нет никакого «формата» (но он эффективно хранится в григорианском календаре).

JDBC не передает отформатированную дату, он просто передает эти 7 байтов и сохраняет ее в классе java.sql.Date (который также просто хранит эти байты).

Если вы хотите отформатировать тип данных DATE, вам необходимо преобразовать его в другой тип данных;обычно это строка, для которой вы хотите использовать TO_CHAR в базе данных Oracle (или какой-либо другой метод для форматирования дат в Java).

...