Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Конвертация формата даты (С) / 17 сообщений из 17, страница 1 из 1
13.06.2006, 15:24:40
    #33787869
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
Привет.

Есть строка с датой следующего вида:

Tue Jun 13 12:30:55 MSD 2006,

т.е. формат '%a %b %e %T %Z %Y'

Задача — сконвертировать в time_t и вернуть как UTC. С mktime(3C) разобрался, непонятно только, что делать с врееменной зоной (которая в данном примере — MSD) — как распарсить это значение?...

C, POSIX, но можно и со спецификой Solaris (9).

Куаукутсу
...
Рейтинг: 0 / 0
13.06.2006, 15:58:14
    #33787995
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
так в tm.tm_zone как раз его и надо запихнуть по идее.
...
Рейтинг: 0 / 0
13.06.2006, 16:16:55
    #33788061
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
А нету у меня tm_zone

/usr/include/iso/time_iso.h
struct tm { /* see ctime(3) */
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};

Куаукутсу
...
Рейтинг: 0 / 0
13.06.2006, 16:17:44
    #33788065
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
И ваще

Код: plaintext
1.
$ find /usr/include -type f -exec grep tm_zone {} \;
$

Куаукутсу
...
Рейтинг: 0 / 0
13.06.2006, 16:23:22
    #33788085
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
ага. у меня RHE
оно действительно не везде есть, вот что они пишут.

man
The glibc version of struct tm has additional fields

long tm_gmtoff; /* Seconds east of UTC */
const char *tm_tm_zone; /* Timezone abbreviation */

defined when _BSD_SOURCE was set before including <time.h>. This is a
BSD extension, present in 4.3BSD-Reno.


правда в хедере tm_zone

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#ifdef  __USE_BSD
  long int tm_gmtoff;           /* Seconds east of UTC.  */
  __const char *tm_zone;        /* Timezone abbreviation.  */
#else
  long int __tm_gmtoff;         /* Seconds east of UTC.  */
  __const char *__tm_zone;      /* Timezone abbreviation.  */
#endif

ествественно в Соляре нету :-(
...
Рейтинг: 0 / 0
13.06.2006, 16:30:55
    #33788114
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
Да фиг с ним, я через putenv могу поставить зону такую, чтобы для неё время на входе было бы как локальное. Но MSD не есть валидное значения для $TZ, там у меня сейчас Europe/Moscow. Вот у коллеги, например, %Z и $TZ - YEKST и Asia/Yekaterinburg соответсвенно. Как бы вытянуть это соответсвие?...

Куаукутсу
...
Рейтинг: 0 / 0
13.06.2006, 17:50:59
    #33788475
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
Scott TigerПривет.

Есть строка с датой следующего вида:

Tue Jun 13 12:30:55 MSD 2006,

т.е. формат '%a %b %e %T %Z %Y'

Задача — сконвертировать в time_t и вернуть как UTC. С mktime(3C) разобрался, непонятно только, что делать с врееменной зоной (которая в данном примере — MSD) — как распарсить это значение?...

C, POSIX, но можно и со спецификой Solaris (9).

Куаукутсу


А если заменить %Z на %z? Будешь обрабатывать исключительно цифровое значение.
...
Рейтинг: 0 / 0
13.06.2006, 18:12:51
    #33788565
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
А вот не могу заменить.

Куаукутсу
...
Рейтинг: 0 / 0
13.06.2006, 18:19:27
    #33788585
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
Вот ещё одна щтука непонятная, tm.is_dst

Куаукутсу
...
Рейтинг: 0 / 0
13.06.2006, 18:25:13
    #33788601
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
Вот ещё одна штука непонятная, tm.is_dst:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main(int argc, char *argv[])
{
        struct tm i_time;

        char s[ 100 ];

        s[ 0 ]='\0';
        strcat(s, "TZ=");
        strcat(s, argv[ 2 ]);

        putenv(s);

        i_time.tm_sec   =  0 ;
        i_time.tm_min   =  0 ;
        i_time.tm_hour  =  0 ;
        i_time.tm_mday  =  1 ;
        i_time.tm_mon   =  0 ;
        i_time.tm_year  =  70 ;
        i_time.tm_isdst = atoi(argv[ 1 ]);

        printf("Timezone: %s, tm_isdst: %s, time_t: %d\n", argv[ 2 ], argv[ 1 ], mktime(&i_time));
}

Теперь пробуем

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
$ cc t.c -o t
$ unset TZ
$ ./t  1  Europe/Moscow
Timezone: Europe/Moscow, tm_isdst: 1, time_t:  -14400 
$ ./t  1  Asia/Yekaterinburg
Timezone: Asia/Yekaterinburg, tm_isdst: 1, time_t:  0 
$ ./t 0 Europe/Moscow
Timezone: Europe/Moscow, tm_isdst: 0, time_t: -10800
$ ./t 0 Asia/Yekaterinburg
Timezone: Asia/Yekaterinburg, tm_isdst: 0, time_t: -18000
$ ./t -1 Europe/Moscow
Timezone: Europe/Moscow, tm_isdst: -1, time_t: -10800
$ ./t -1 Asia/Yekaterinburg
Timezone: Asia/Yekaterinburg, tm_isdst: -1, time_t: -18000

Так понимаю, что то ли zoneinfo битый для Asia/Yekaterinburg, то ли я совсем не копенгаген

Куаукутсу
...
Рейтинг: 0 / 0
13.06.2006, 18:38:43
    #33788654
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
Код: plaintext
1.
2.
3.
4.
$ uname -srvmp
SunOS 5.9 Generic_118558-26 sun4u sparc
$ cc -V
cc: Sun C 5.8 2005/10/13

На всякий случай.

Куаукутсу
...
Рейтинг: 0 / 0
14.06.2006, 17:12:20
    #33790957
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
И вот ещё 100% решение твоей задачи на Java. Как это на С реализовать - я не знаю.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
import java.util.TimeZone;

public class cal 
{ 
public static void main(String[] args) 
{ 
TimeZone tz = TimeZone.getTimeZone("Europe/Moscow");
System.out.println("SHORT TomeZone:"+tz.getDisplayName(true,TimeZone.SHORT)); 
System.out.println("LONG TomeZone:"+tz.getDisplayName(true,TimeZone.LONG)); 

} 
} 

Код: plaintext
1.
2.
3.
>java cal

SHORT TomeZone:MSD
LONG TomeZone:Moscow Daylight Time

Для Asia/Yekaterinburg
Код: plaintext
1.
SHORT TomeZone:YEKST
LONG TomeZone:Yekaterinburg Summer Time
...
Рейтинг: 0 / 0
14.06.2006, 17:18:39
    #33790980
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
Хотя тебе вроде наоборот надо. Вобщем чувствую, решение где-то рядом....

Я понимаю так, что одному краткому значению может соответствовать несколько разных длинных названий. Поэтому по краткому названию нельзя однозначно получить длинное соответствие. А вот наоборот можно(пример постом выше). Но это тоже ИМХО.
...
Рейтинг: 0 / 0
15.06.2006, 10:28:58
    #33792021
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
Но ты не сможешь по краткому названию однозначно получить timezone. Например "MDT" соответствует зонам:
авторAmerica/Denver
America/Edmonton
America/Mazatlan
"WAT":
авторAfrica/Bangui
Africa/Douala
Africa/Kinshasa
Africa/Lagos итд.

"EEST":
авторEurope/Athens
Europe/Bucharest
Europe/Chisinau
Europe/Helsinki
Europe/Istanbul
Europe/Kaliningrad
Europe/Kiev
Europe/Minsk
Europe/Riga
Europe/Simferopol
Europe/Sofia
...
Рейтинг: 0 / 0
15.06.2006, 16:38:30
    #33793586
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
Поскольку Скоти так и не появился - для творчества есть ещё место :)

Добавил в файл смещение(Offset) для лета. Код такой соответственно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
import java.util.TimeZone;

public class cal 
{ 
 public static void main(String[] args) 
 { 
  String[] all_id = TimeZone.getAvailableIDs();
  TimeZone tz;
  int i;
  for (i= 0 ;i<all_id.length;i++)
  {
   tz = TimeZone.getTimeZone(all_id[i]);
   System.out.println(all_id[i]+"|"+tz.getRawOffset()/ 1000 +"|"+ 
   					  tz.getDisplayName(true,TimeZone.SHORT)+"|"+tz.getDisplayName(true,TimeZone.LONG)+"|"+
					  tz.getDisplayName(false,TimeZone.SHORT)+"|"+tz.getDisplayName(false,TimeZone.LONG));
  }
 } 
} 

Вывод перенаправил в файл. Оформил в виде xls-файла. Дальше это можно засунуть в таблицу в БД и написать соответствующую функцию конвертации.
Файл TimeZone.xls прилагаю.
"daylight" - это летнее время.
...
Рейтинг: 0 / 0
15.06.2006, 16:48:22
    #33793635
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
Вот такие приколы наблюдаются:
Код: plaintext
1.
2.
3.
America/Halifax	- 14400 	ADT	Atlantic Daylight Time
America/Thule	- 14400 	ADT	Atlantic Daylight Time
Atlantic/Bermuda - 14400 	ADT	Atlantic Daylight Time
Asia/Baghdad	 10800 	ADT	Arabia Daylight Time
...
Рейтинг: 0 / 0
16.06.2006, 09:40:39
    #33794586
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация формата даты (С)
Да уж, засада, блин, с этими сокращёнными наименованиями...

Куаукутсу
...
Рейтинг: 0 / 0
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Конвертация формата даты (С) / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]