Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Sanio
6 / 6 / 1
Регистрация: 28.02.2012
Сообщений: 14
#1

Преобразования типа в DateTime - C#

16.03.2012, 10:50. Просмотров 1712. Ответов 4
Метки нет (Все метки)

Вопрос следующего характера.
В некотором файле имееться заголовок в котором одно из полей - FTIME (4 байта) = Дата и время в стандартном формате MS-DOS.
Как преобразовать в DateTime.
Пробывал через:
C#
1
DateTime.FromFileTime((long)FTIME);
и
C#
1
DateTime.FromBinary((long)FTIME);
данные отображаються не корректно.
Может подскажет кто как преобразовать в DateTime?
http://www.cyberforum.ru/csharp-net/thread88483.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2012, 10:50
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Преобразования типа в DateTime (C#):

DateTime
Подскажите код для примера сравнения дат на asp.net.

DateTime
как поставить системыне часы на Label? Пробовал сделать так using System;...

Из секунд в DateTime
как перевести секунды, например число 1256128953, в DateTime или какой-либо...

DateTime.Now.Ticks
Чему равна секунда или милисекунда в этом формате?

Ошибка DateTime.Now
Здраствуйте! На одном с компьютеров DateTime.Now возвращает 0086 год, хотя дата...

4
Dzhej-Dzhej
Заблокирован
16.03.2012, 11:57 #2
Может получится так без структуры
C#
1
2
            DateTime d = System.IO.File.GetCreationTime(@"D:\5\2.jpg");
            Console.WriteLine(d.ToString());
0
Sanio
6 / 6 / 1
Регистрация: 28.02.2012
Сообщений: 14
16.03.2012, 13:11  [ТС] #3
ок
считываю из файла значение FTIME=917220888, что должно быть равно 11.05.2007 21:48
следущее значение FTIME=915127703 - 11.04.2007 23:44
далее:
FTIME=915127677 - 11.04.2007 23:43
FTIME=915474985 - 17.04.2007 01:17
FTIME=691951206 - 30.09.2000 10:51

Добавлено через 2 минуты
Цитата Сообщение от Dzhej-Dzhej Посмотреть сообщение
Может получится так без структуры
C#
1
2
            DateTime d = System.IO.File.GetCreationTime(@"D:\5\2.jpg");
            Console.WriteLine(d.ToString());
Я получаю Дату не самого файла, а записаных в файле.

Добавлено через 53 минуты
Решил следующим путем.
Согластно описанной API функции в MSDSN в которой расписываеться формат времени файла в MSDOS
BOOL WINAPI DosDateTimeToFileTime(
__in WORD wFatDate,
__in WORD wFatTime,
__out LPFILETIME lpFileTime
);:
wFatDate [in]
The MS-DOS date. The date is a packed value with the following format.
Bits Description
0-4 Day of the month (1–31)
5-8 Month (1 = January, 2 = February, and so on)
9-15 Year offset from 1980 (add 1980 to get actual year)

wFatTime [in]
The MS-DOS time. The time is a packed value with the following format.
Bits Description
0-4 Second divided by 2
5-10 Minute (0–59)
11-15 Hour (0–23 on a 24-hour clock)

Написал слудующую функцию преобразования:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        private DateTime DosTimeToDateTime(uint Time)
        {
            ushort FateDate = (ushort)(Time>>16);
            ushort FateTime = (ushort)(Time);
            ushort Year = (ushort)((FateDate >> 9)+1980);
            ushort TempMonthDay = (ushort)((FateDate ^ (ushort)((Year-1980)<<9)));
            byte Month = (byte)(TempMonthDay >> 5);
            byte Day = (byte)(TempMonthDay^(ushort)(Month<<5));
            byte Hour = (byte)(FateTime >> 11);
            ushort TempMinutsSeconds = (ushort)((FateTime ^ (ushort)(Hour << 11)));
            byte Minuts = (byte)(TempMinutsSeconds >> 5);
            byte Seconds = (byte)((TempMinutsSeconds ^ (ushort)(Minuts << 5)) / 2);
            return (new DateTime(Year, Month, Day, Hour, Minuts, Seconds));
        }
Добавлено через 15 минут
Ошибочка вышла в расчете секунд: вместо деления на 2 значение надо умножить на 2.
C#
1
byte Seconds = (byte)((TempMinutsSeconds ^ (ushort)(Minuts << 5)) * 2);
0
Dzhej-Dzhej
Заблокирован
16.03.2012, 13:22 #4
Опоздал я:
C#
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
27
28
29
30
31
32
33
using System;
 
namespace S
{
    public class C
    {
        static DateTime GetTime(int FTIME)
        {
            int Second = (FTIME & 15) * 2;
            FTIME >>= 5;
            int Minute = FTIME & 63;
            FTIME >>= 6;
            int Hour = FTIME & 31;
            FTIME >>= 5;
            int Day = FTIME & 15;
            FTIME >>= 5;
            int Month = (int)FTIME & 7;
            FTIME >>= 4;
            int Year = (int)FTIME + 1980;
            return new DateTime(Year, Month, Day, Hour, Minute, Second);
        }
        public static void Main()
        {
            Console.WriteLine(GetTime(917220888).ToString());
            Console.WriteLine(GetTime(915127703).ToString());
            Console.WriteLine(GetTime(915127677).ToString());
            Console.WriteLine(GetTime(915474985).ToString());
            Console.WriteLine(GetTime(691951206).ToString());
 
            Console.ReadKey();
        }
    }
}
0
Sanio
6 / 6 / 1
Регистрация: 28.02.2012
Сообщений: 14
16.03.2012, 13:31  [ТС] #5
Цитата Сообщение от Dzhej-Dzhej Посмотреть сообщение
Опоздал я:
C#
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
27
28
29
30
31
32
33
using System;
 
namespace S
{
    public class C
    {
        static DateTime GetTime(int FTIME)
        {
            int Second = (FTIME & 15) * 2;
            FTIME >>= 5;
            int Minute = FTIME & 63;
            FTIME >>= 6;
            int Hour = FTIME & 31;
            FTIME >>= 5;
            int Day = FTIME & 15;
            FTIME >>= 5;
            int Month = (int)FTIME & 7;
            FTIME >>= 4;
            int Year = (int)FTIME + 1980;
            return new DateTime(Year, Month, Day, Hour, Minute, Second);
        }
        public static void Main()
        {
            Console.WriteLine(GetTime(917220888).ToString());
            Console.WriteLine(GetTime(915127703).ToString());
            Console.WriteLine(GetTime(915127677).ToString());
            Console.WriteLine(GetTime(915474985).ToString());
            Console.WriteLine(GetTime(691951206).ToString());
 
            Console.ReadKey();
        }
    }
}
. Хорошее решенье не так наварочено. Понятнее.

Во посидел чуть подумал и вот реультат мыслей:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        private DateTime DosTimeToDateTime(uint Time)
        {
            ushort FateDate = (ushort)(Time>>16);
            ushort FateTime = (ushort)(Time);
            byte bDay = (byte)(FateDate & 0x1F);
            byte bMonth = (byte)((FateDate & 0x1E0) >> 5);
            ushort usYear=(ushort)(1980+((FateDate & 0xFE00) >>9));
            byte bSeconds = (byte)(2*(FateTime & 0x1F));
            byte bMinuts = (byte)((FateTime & 0x7E0) >> 5);
            byte bHour = (byte)((FateTime & 0xF800) >> 11);
 
            return (new DateTime(usYear, bMonth, bDay, bHour, bMinuts, bSeconds));
        }
0
16.03.2012, 13:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2012, 13:31
Привет! Вот еще темы с решениями:

Ошибка с DateTime
Народ, кто-нибудь понимает, что это за ошибка? Я так понимаю, что в...

Datetime в time
Здравствуйте! у меня такая проблема: есть база данных, в которой хранятся...

Парсинг DateTime
Добрый день! С Ftp сервера получаю информацию о датах создания файлов. При...

DateTime и Add
вот кусок кода DateTime timeEndTrue = item.ДатаСоздания.Value;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru