Описание
Метод принимает строку с датой (например, ) и возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 по UTC. Этот метод полезен для установки значения даты из строкового значения, например, в сочетании с методом о объектом .
По данному строковому представлению времени метод возвращает значение времени. Он принимает синтаксис даты из RFC2822 / IETF (RFC2822 раздел 3.3 — , ), например, . Он понимает аббревиатуры континентальных часовых поясов США, но для общего пользования используйте смещение часовых поясов, например, (4 часа 30 минут к востоку от Гринвичского меридиана). Если часовой пояс не определён и строка является форматом ISO, распозначаемым ES5, предполагается, что часовым поясом является UTC. GMT и UTC считаются эквивалентными. Местный часовой пояс используется для интерпретации аргумента в формате RFC2822 из раздела 3.3 (, ) (или в любом другом формате, не распознаваемым как ISO 8601 в ES5), если он не содержит информации о часовом поясе.
Строка с датой и временем может быть в формате ISO 8601. Например, могут быть переданы и разобраны строки (только дата) или (дата и время). Для интерпретации аргументов в формате ISO 8601, не содержащих информацию о часовом поясе, используется часовой пояс UTC.
Хотя во время разбора строки с датой и используется спецификатор часового пояса, возвращаемое значение всегда содержит количество миллисекунд между 1 января 1970 года 00:00:00 по UTC и моментом времени, представленным аргументом.
Поскольку метод является статическим методом объекта , вы всегда должны использовать его как .
Для строки даты , метод будет предполагать местный часовой пояс, но если строка дана в формате ISO, например , он будет предполагать, что часовой пояс равен UTC. Поэтому объекты , созданные из этих строк, если в системе местный часовой пояс не равен UTC, будут представлять разные моменты времени. Это значит, что две строки с датами, которые выглядят одинаковыми, могут дать два разных значения в зависимости от формата преобразуемой строки.
В спецификации ECMAScript говорится: если строка не соответствует стандартному формату, функция может откатиться к любой зависимой от реализации эвристике, либо к зависимому от реализации алгоритму разбора. Нераспознанные строки, либо даты, содержащие недопустимые значения элементов в строках формата ISO, должны при вызове возвращать .
Однако, недопустимые значения в строке даты, не распознанные как формат ISO, как определено ES5 могут возвращать, а могут и не возвращать в качестве результата, в зависимости от браузера и предоставленных значений, например:
будет рассматриваться как местная дата 25 ноября 2015 года в Firefox 30 и как недопустимая дата в Safari 7. Однако, если строка распознана как строка в формате ISO и она содержит недопустимые значения, метод вернёт во всех браузерах, совместимых с ES5:
Реализация эвристики SpiderMonkey может быть найдена в файле . Строка является примером не подходящей под формат ISO и поэтому её разбор откатывается на пользовательскую подпрограмму. Так же смотрите эту работы разбора строки.
будет рассматриваться как местная дата 6 октября 2014 года, а не 10 июня 2014 года. Другие примеры:
6 ответов
Лучший ответ
Возможное решение:
1
Kees de Wit
3 Дек 2015 в 07:09
Пытаться:
Обновил код, чтобы учесть ваш последний комментарий. вот как вы бы скрыли / показывали «-». но это все зависит от того, как вы хотите вести дело.
NPToita
3 Дек 2015 в 10:40
Если вы хотите разрешить , сделайте поле как в таблице базы данных. Затем это позволит без проблем вставить значения .
Кроме того, если вы хотите разрешить такое значение, как вы показали, вам нужно будет сделать поле как , так как это не будет распознано как действительное .
Еще одно важное замечание: вместо такого хранения вы можете легко создать два отдельных столбца для периода от-до и сохранить значения в обоих соответственно. Это также даст вам преимущество при запросе данных и фильтрации данных по требуемым датам
ОБНОВЛЕНИЕ:
Вы также получите это исключение, если передадите и используете . Поэтому перед использованием убедитесь, что вы передаете что-то здесь, будь то дата или строка. А на бэкэнде вы можете изменить тип данных по своему усмотрению.
Здесь неплохо было бы реализовать проверку на нуль перед преобразованием с помощью . Если он равен нулю, вы можете сразу передать , а если нет, вы можете преобразовать значение, а затем передать его.
Надеюсь это поможет.
Matt Murdock
3 Дек 2015 в 07:02
Возможно, вы захотите отразить параметр, допускающий значение NULL, в своем представлении C # определения DateTime:
Обе формы эквивалентны.
Конечно, при работе со значением в C # вы должны определить, что делать с , и вы не можете полагаться на какую-то магию для своих преобразований.
Вы также можете ознакомиться с этим вопросом. Суть: используйте , чтобы получить обнуляемый из datarow.
Community
23 Май 2017 в 12:07
Null не имеет функции ToString (), поэтому, если вы ожидаете, что результаты будут нулевыми, вы должны убедиться, что вы не будете вызывать для него функцию.
RekaB
3 Дек 2015 в 07:23
Использование может помочь вам проверить, есть ли недопустимая дата, и соответствующим образом изменить вашу бизнес-логику.
Omkar Khair
3 Дек 2015 в 07:04
Структура DateTime
Значение DateTime определяет конкретную дату и время. Он включает Kind свойство, которое предоставляет ограниченные сведения о часовом поясе, к которому относится эта дата и время. Значение DateTimeKind , возвращаемое свойством Kind , указывает, представляет ли значение DateTime местное время (), время в формате UTC () или неопределенное время ().
DateTimeСтруктура подходит для приложений с одной или несколькими из следующих характеристик.
работают только с датами;
работают только со временем;
работают с абстрактными датами и временем;
работают с датами и временем, для которых отсутствуют сведения о часовом поясе;
работают только с датами и временем в формате UTC;
получение сведений о дате и времени из источников за пределами .net, например SQL баз данных. (как правило, информация о дате и времени хранится в этих источниках в простом формате, который совместим со структурой DateTime );
выполняют арифметические операции с датой и временем, но учитывают только общие результаты
Например, в операции сложения, которая добавляет шесть месяцев к определенным дате и времени, часто не важно, корректируется ли результат с учетом перехода на летнее время.
Кроме случая, когда определенное значение DateTime представляет время в формате UTC, значение даты и времени часто является неоднозначным или ограниченным в плане возможности переноса. Например, если значение DateTime представляет местное время, оно является переносимым внутри местного часового пояса (то есть если значение десериализуется в другой системе в том же часовом поясе, оно по-прежнему однозначно определяет конкретный момент времени). За пределами местного часового пояса значение DateTime может иметь несколько интерпретаций. Если свойство Kind имеет значение , значение даты и времени становится еще менее переносимым: в этом случае оно неоднозначно даже в том же часовом поясе и, возможно, даже на том же компьютере, на котором оно было впервые сериализовано. Значение DateTime однозначно идентифицирует момент времени независимо от времени системы или часового пояса, в котором оно используется, только если это значение представляет время в формате UTC.
Важно!
При сохранении или совместном использовании данных DateTime следует использовать формат UTC, а для свойства DateTime значения Kind должно быть задано значение .
Описание
- Если никаких аргументов передано не было, конструктор создаёт объект для текущих даты и времени, согласно системным настройкам.
- Если передано как минимум два аргумента, отсутствующие аргументы устанавливаются в стартовые значения — день месяца 1 и время полуночи.
- Дата в JavaScript измеряется в миллисекундах, прошедших с полуночи 1 января 1970 года по UTC. День содержит 86 400 000 миллисекунд. Диапазон дат объекта варьируется от -100 000 000 до 100 000 000 дней относительно 1 января 1970 года по UTC.
- Объект обеспечивает универсальное поведение на всех платформах. Значение времени может передаваться между системами для представления одинакового момента во времени и, если оно используется для создания локального объекта даты, будет отражать местный эквивалент времени.
- Объект поддерживает несколько методов для работы с UTC (всемирным координированным временем), наряду с методами работы с местным временем. UTC, также известное как среднее время по Гринвичу (GMT), ссылается на время, установленное Всемирным стандартом времени. Местное время — это время на компьютере, на котором выполняется JavaScript.
- Вызов объекта в качестве функции (то есть, без использования оператора ) вернёт строку, представляющую текущие дату и время.
Примеры
Если переменная содержит существующий объект , она может быть установлена в 9 августа 1995 года (по местному времени) следующим способом:
Ещё несколько примеров разбора нестандартных строк с датами:
Вернёт в часовом поясе GMT-0300, и другие значения в других часовых поясах, так как поскольку строка не определяет часовой пояс и не находится в формате ISO, то часовой пояс по умолчанию равен местному часовому поясу.
Вернёт вне зависимости от местного часового пояса, поскольку предоставлен спецификатор GMT (всемирное координированное время).
Вернёт в часовом поясе GMT-0300, и другие значения в других часовых поясах, так как поскольку строка не определяет часовой пояс и не находится в формате ISO, то часовой пояс по умолчанию равен местному часовому поясу.
Вернёт вне зависимости от местного часового пояса, поскольку предоставлен спецификатор GMT (всемирное координированное время).
Вернёт в часовом поясе GMT-0400, и другие значения в других часовых поясах, так как поскольку строка не определяет часовой пояс и не находится в формате ISO, то используется местный часовой пояс.
Вернёт вне зависимости от местного часового пояса, поскольку предоставлен спецификатор GMT (всемирное координированное время).
Автоисправление даты
Автоисправление – это очень полезная особенность объектов . Можно устанавливать компоненты даты вне обычного диапазона значений, а объект сам себя исправит.
Пример:
Неправильные компоненты даты автоматически распределяются по остальным.
Предположим, нам требуется увеличить дату «28 февраля 2016» на два дня. В зависимости от того, високосный это год или нет, результатом будет «2 марта» или «1 марта». Нам об этом думать не нужно. Просто прибавляем два дня. Объект позаботится об остальном:
Эту возможность часто используют, чтобы получить дату по прошествии заданного отрезка времени. Например, получим дату «спустя 70 секунд с текущего момента»:
Также можно установить нулевые или даже отрицательные значения. Например:
smalldatetime description
Property | Value |
---|---|
Syntax | smalldatetime |
Usage | DECLARE @MySmalldatetime smalldatetime CREATE TABLE Table1 ( Column1 smalldatetime ) |
Default string literal formats (used for down-level client) | Not applicable |
Date range | 1900-01-01 through 2079-06-06 January 1, 1900, through June 6, 2079 |
Time range | 00:00:00 through 23:59:59 2007-05-09 23:59:59 will round to 2007-05-10 00:00:00 |
Element ranges | YYYY is four digits, ranging from 1900, to 2079, that represent a year. MM is two digits, ranging from 01 to 12, that represent a month in the specified year. DD is two digits, ranging from 01 to 31 depending on the month, that represent a day of the specified month. hh is two digits, ranging from 00 to 23, that represent the hour. mm is two digits, ranging from 00 to 59, that represent the minute. ss is two digits, ranging from 00 to 59, that represent the second. Values that are 29.998 seconds or less are rounded down to the nearest minute. Values of 29.999 seconds or more are rounded up to the nearest minute. |
Character length | 19 positions maximum |
Storage size | 4 bytes, fixed. |
Accuracy | One minute |
Default value | 1900-01-01 00:00:00 |
Calendar | Gregorian (Doesn’t include the complete range of years.) |
User-defined fractional second precision | No |
Time zone offset aware and preservation | No |
Daylight saving aware | No |
Разбор строки с датой
Метод Date.parse(str) считывает дату из строки.
Формат строки должен быть следующим: , где:
- – это дата: год-месяц-день.
- Символ используется в качестве разделителя.
- – время: часы, минуты, секунды и миллисекунды.
- Необязательная часть обозначает часовой пояс в формате . Если указать просто букву , то получим UTC+0.
Возможны и более короткие варианты, например, или , или даже .
Вызов обрабатывает строку в заданном формате и возвращает таймстамп (количество миллисекунд с 1 января 1970 года UTC+0). Если формат неправильный, возвращается .
Например:
Можно тут же создать объект из таймстампа:
Определение значений даты и времени в качестве литералов
Вы можете указать типы данных даты и времени, используя множество различных форматов строк литералов, которые SQL Server затем оценивает во время выполнения, преобразовывая их во внутренние структуры даты и времени. SQL Server распознает данные даты и времени, заключенные в одинарные кавычки (‘). Некоторые форматы продемонстрированы в следующих примерах.
-
Буквенные форматы даты, такие как .
-
Числовые форматы даты, такие как .
-
Неразделенные форматы строк, например строка , которая будет интерпретироваться как 15 октября 2006 г., если вы используете формат даты по стандарту ISO.
Примечание
Вы можете найти полную документацию по всем форматам строк литералов и другим функциям типов данных даты и времени в электронной документации на SQL Server.
Значения времени, которые меньше нуля, больше или равны 24 часам, вызовут исключение ArgumentException.
Получение компонентов даты
Для доступа к компонентам даты-времени объекта используются следующие методы:
- Получить год (из 4 цифр)
- Получить месяц, от 0 до 11.
- Получить число месяца, от 1 до 31.
- Получить соответствующие компоненты.
Не , а
Некоторые браузеры реализуют нестандартный метод . Где-то он возвращает только две цифры из года, где-то четыре. Так или иначе, этот метод отсутствует в стандарте JavaScript. Не используйте его. Для получения года есть .
Дополнительно можно получить день недели:
- Получить номер дня в неделе. Неделя в JavaScript начинается с воскресенья, так что результат будет числом от 0(воскресенье) до 6(суббота).
Все методы, указанные выше, возвращают результат для местной временной зоны.
Существуют также UTC-варианты этих методов, возвращающие день, месяц, год и т.п. для зоны GMT+0 (UTC): , , . То есть, сразу после вставляется .
Если ваше локальное время сдвинуто относительно UTC, то следующий код покажет разные часы:
Кроме описанных выше, существуют два специальных метода без UTC-варианта:
-
Возвращает число миллисекунд, прошедших с 1 января 1970 года GMT+0, то есть того же вида, который используется в конструкторе .
-
Возвращает разницу между местным и UTC-временем, в минутах.
Синтаксис
-
Необязательный параметр. Строка с языковой меткой BCP 47, либо массив таких строк. Описание общей формы и интерпретации аргумента смотрите на . Разрешены следующие ключи расширения Unicode:
- Используемая система нумерации. Возможные значения включают в себя: , , , , , , , , , , , , , , , , , , , , , .
- Используемый календарь. Возможные значения включают в себя: , , , , , , , , , , , , , .
-
Необязательный параметр. Объект с некоторыми или всеми из следующих свойств:
- Используемый алгоритм сопоставления локалей. Возможными значениями являются и ; значением по умолчанию является . Информацию по этой опции смотрите на .
- Используемый часовой пояс. Единственным значением, которые реализации обязаны распознавать, является ; значением по умолчанию является часовой пояс по умолчанию среды выполнения. Реализации также могут распознавать названия часовых поясов из базы данных часовых поясов IANA, например , или .
- Определяет, использовать ли 12-часовой формат времени (в противовес 24-часовому). Возможными значениями являются и ; значение по умолчанию зависит от локали.
- Используемый алгоритм сопоставления форматов. Возможными значениями являются и ; значением по умолчанию является . Смотрите следующий абзац, объясняющий, как использовать это свойство.
Следующие свойства описывают компоненты даты/времени, используемые в форматированном выводе, и их желаемые представления. Реализации должны поддерживать, как минимум, следующие подмножества:
- , , , , , ,
- , , ,
- , ,
- ,
- ,
- , ,
- ,
Также реализации могут поддерживать другие подмножества и запросы будут сравниваться со всеми доступными подмножествами представлений для поиска наилучшего соответствия. Для такого сравнения доступно два алгоритма, нужный из которых выбирается свойством : и зависящий от реализации алгоритм .
- Представление дней недели. Возможными значениями являются , и .
- Представление эр. Возможными значениями являются , и .
- Представление лет. Возможными значениями являются и .
- Представление месяцев. Возможными значениями являются , , , и .
- Представление дней. Возможными значениями являются и .
- Представление часов. Возможными значениями являются и .
- Представление минут. Возможными значениями являются и .
- Представление секунд. Возможными значениями являются и .
- Представление названий часовых поясов. Возможными значениями являются и .
Значение по умолчанию для всех свойств компонентов даты/времени является значение ,но если все свойства компонентов будут равны , то будет предполагаться, что значением свойств , и является .
Первый вариант решения
В Entity Framework для создания SQL команд миграции используется класс MigrationSqlGenerator. Таким образом, необходимо предоставить его реализацию, которая преобразует DateTime с учетом диапазона и игнорируя текущие региональные настройки.
Задача может показаться сложной. Однако на практике все достаточно легко. В зависимости от того, какая база данных используется, необходимо в качестве базового класса взять:
- SqlServerMigrationSqlGenerator – для SQL Server / SQL Server Express / LocalDb.
- SqlCeMigrationSqlGenerator – для SQL Server Compact.
После этого остается только переопределить метод Generate(DateTime defaultValue).
Свойство типа DateTime будет представлено в базе данных полем datetime, которое может принимать значения от 1 января 1753 до 31 декабря 9999 года. Учтём это при формировании текстового представления даты. Кроме того, жестко определим его формат и используем CultureInfo.InvariantCulture, чтобы исключить влияние региональных настроек.
Остается только указать Entity Framework использовать исправленную версию SQL генератора. Для этого в конструкторе класса Configuration добавим следующую строку:
Обратите внимание, что здесь указано имя провайдера для SQL Server. Для SQL Server Compact необходимо указать System.Data.SqlServerCe.4.0
Давайте теперь повторим попытку модифицировать схему базы данных:
PM> Update-Database -Verbose Using NuGet project 'EFMigrationsDateTimeDemo'. Using StartUp project 'EFMigrationsDateTimeDemo'. Target database is: 'EFMigrationsDateTimeDemo.AppDbContext' (DataSource: .\SQLEXPRESS, Provider: System.Data.SqlClient, Origin: Convention). No pending explicit migrations. Applying automatic migration: 201205020748408_AutomaticMigration. ALTER TABLE ADD NOT NULL DEFAULT '1753-01-01 00:00:00'
Миграция прошла успешно.
Внесение значений даты и времени в столбцы таблицы
Рассмотрим, как вносятся значения date MySQL в таблицу. Чтобы продемонстрировать это, мы продолжим использовать таблицу orders, которую создали в начале статьи.
Мы начнем с добавления новой строки заказа. Значение поля order_no будет автоматически увеличиваться на 1, так что нам остается вставить значения order_item, дату создания заказа и дату доставки. Дата заказа — это время, в которое вставляется заказ, поэтому мы можем использовать функцию NOW(), чтобы внести в строку текущую дату и время.
Дата доставки — это период времени после даты заказа, которую мы можем вернуть, используя функцию MySQL DATE ADD(), которая принимает в качестве аргументов дату начала (в нашем случае NOW ()) и INTERVAL (в нашем случае 14 дней). Например:
INSERT INTO orders (order_item, order_date, order_delivery) VALUES ('iPhone 8Gb', NOW(), DATE_ADD(NOW(), INTERVAL 14 DAY));
Данный запрос создает заказ для указанного элемента с датой, временем выполнения заказа, и интервалом через две недели после этого в качестве даты доставки:
mysql> SELECT * FROM orders; +----------+------------+---------------------+----------------+ | order_no | order_item | order_date | order_delivery | +----------+------------+---------------------+----------------+ | 1 | iPhone 8Gb | 2007-10-23 11:37:55 | 2007-11-06 | +----------+------------+---------------------+----------------+ 1 row in set (0.00 sec)
Точно так же можно заказать товар с датой доставки через два месяца:
mysql> INSERT INTO orders (order_item, order_date, order_delivery) VALUES ('ipod Touch 4Gb', NOW(), DATE_ADD(NOW(), INTERVAL 2 MONTH)); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM orders; +----------+----------------+---------------------+----------------+ | order_no | order_item | order_date | order_delivery | +----------+----------------+---------------------+----------------+ | 1 | iPhone 8Gb | 2007-10-23 11:37:55 | 2007-11-06 | | 2 | ipod Touch 4Gb | 2007-10-23 11:51:09 | 2007-12-23 | +----------+----------------+---------------------+----------------+ 2 rows in set (0.00 sec)
Описание типа данных smalldatetime
Свойство | Значение |
---|---|
Синтаксис | smalldatetime |
Использование | DECLARE @MySmalldatetime smalldatetime CREATE TABLE Таблица1 ( Столбец1 smalldatetime ) |
Форматы строковых литералов по умолчанию (используется для клиента нижнего уровня) | Неприменимо |
Диапазон даты | От 01.01.1900 до 06.06.2079 1 января 1900 года — 6 июня 2079 года |
Диапазон времени | От 00:00:00 до 23:59:59 2007-05-09 23:59:59 округляется до 2007-05-10 00:00:00 |
Диапазоны элементов | ГГГГ — четырехзначное число от 1900 до 2079, представляющее год. ММ обозначает 2 цифры, которые представляют месяц и принимают значения от 01 до 12. Обозначение ДД состоит из двух цифр, представляющих день указанного месяца, и принимает значения от 01 до 31 в зависимости от месяца. Обозначение чч состоит из двух цифр, представляющих час, и принимает значения от 00 до 23. Обозначение мм состоит из двух цифр, представляющих минуту, и принимает значения от 00 до 59. Обозначение сс состоит из двух цифр, представляющих секунду, и принимает значения от 00 до 59. Значения 29,998 с или меньше округляются до ближайшей минуты. Значения 29,999 с или больше округляются до ближайшей минуты. |
Длина в символах | Максимально 19 позиций |
Объем памяти | 4 байта, фиксированный. |
Точность | Одна минута |
Значение по умолчанию | 1900-01-01 00:00:00 |
Календарь | Григорианский (Не включает полный диапазон лет.) |
Определяемая пользователем точность в долях секунды | Нет |
Учет и сохранение смещения часового пояса | Нет |
Учет перехода на летнее время | Нет |
Класс TimeZoneInfo
Класс TimeZoneInfo class represents any of the Earth’s time zones, and enables the conversion of any date and time in one time zone to its equivalent in another time zone. Класс TimeZoneInfo позволяет работать со значениями даты и времени, обеспечивая однозначную идентификацию единственного момента времени с помощью любого значения даты и времени. Класс TimeZoneInfo также является расширяемым. Хотя он зависит от сведений о часовом поясе, предоставленных для систем Windows и определенных в реестре, он поддерживает создание настраиваемых часовых поясов. Кроме того, он поддерживает сериализацию и десериализацию сведений о часовом поясе.
В некоторых случаях использование всех преимуществ класса TimeZoneInfo может потребовать дальнейших усилий по разработке. Если значения даты и времени не тесно связаны с часовыми поясами, к которым они относятся, требуется дополнительная работа. Если приложение не предоставляет какой-либо механизм для связывания даты и времени со связанным часовым поясом, то определенное значение даты и времени можно легко привязать к его часовому поясу. Одним из способов связывания этой информации является определение класса или структуры, содержащих значение даты и времени и связанный с ним часовой пояс.
Чтобы воспользоваться преимуществами поддержки часовых поясов в .NET, необходимо знание часового пояса, к которому принадлежит значение даты и времени при создании экземпляра объекта даты и времени. Часовой пояс часто неизвестен, особенно в веб-или сетевых приложениях.
Создание
Для создания нового объекта типа используется один из синтаксисов:
-
Создаёт объект с текущей датой и временем:
-
Создаёт объект , значение которого равно количеству миллисекунд (1/1000 секунды), прошедших с 1 января 1970 года GMT+0.
-
Если единственный аргумент – строка, используется вызов (см. далее) для чтения даты из неё.
-
Дату можно создать, используя компоненты в местной временной зоне. Для этого формата обязательны только первые два аргумента. Отсутствующие параметры, начиная с считаются равными нулю, а – единице.
Заметим:
-
Год должен быть из 4 цифр.
-
Отсчёт месяцев начинается с нуля 0.
Например:
Дата задана с точностью до миллисекунд:
Разбор строки, Date.parse
Все современные браузеры, включая IE9+, понимают даты в упрощённом формате ISO 8601 Extended.
Этот формат выглядит так: , где:
- – дата в формате год-месяц-день.
- Обычный символ используется как разделитель.
- – время: часы-минуты-секунды-миллисекунды.
- Часть обозначает временную зону – в формате , либо символ , обозначающий UTC. По стандарту её можно не указывать, тогда UTC, но в Safari с этим ошибка, так что лучше указывать всегда.
Также возможны укороченные варианты, например или или даже только .
Метод разбирает строку в таком формате и возвращает соответствующее ей количество миллисекунд. Если это невозможно, возвращает .
Например:
С таймзоной :
Формат дат для IE8-
До появления спецификации ECMAScript 5 формат не был стандартизован, и браузеры, включая IE8-, имели свои собственные форматы дат. Частично, эти форматы пересекаются.
Например, код ниже работает везде, включая старые IE:
Вы также можете почитать о старых форматах IE в документации к методу MSDN Date.parse.
Конечно же, сейчас лучше использовать современный формат. Если же нужна поддержка IE8-, то метод , как и ряд других современных методов, добавляется библиотекой es5-shim.
Формат и порядок даты
То, как SQL Server анализирует значения даты и времени, зависит не только от версии системы типов и версии сервера, но также от параметров языка и формата по умолчанию для сервера. Строка даты, которая подходит для форматов даты одного языка, может быть нераспознаваемой, если запрос выполняется подключением, в котором используются другие язык и формат даты.
Инструкция Transact-SQL SET LANGUAGE неявно устанавливает DATEFORMAT, который определяет порядок частей даты. Вы можете использовать инструкцию SET DATEFORMAT Transact-SQL в подключении для устранения неоднозначности значений даты путем упорядочения частей даты в порядке МДГ, ДМГ, ГМД, ГДМ, МГД или ДГМ.
Если вы не укажете DATEFORMAT для подключения, SQL Server использует связанный с этим подключением язык по умолчанию. Например, строка даты «01/02/03» будет интерпретироваться как МДГ (2 января 2003 г.) на сервере с заданным языком «английский (США)» и как ДМГ (1 февраля 2003 г.) на сервере с заданным языком «английский (Великобритания)». Год определяется с помощью правила порогового года SQL Server, которое определяет пороговую дату для назначения значения столетия. Дополнительные сведения см. в разделе Параметр отсечения двух цифр года электронной документации на SQL Server.
Примечание
Формат даты ГДМ не поддерживается при преобразовании из формата строки в , , или .
Дополнительные сведения об интерпретации сервером SQL Server даты и времени см. в разделе Использование данных даты и времени электронной документации на SQL Server 2008.
Примеры
A. Приведение строковых литералов с секундами к типу smalldatetime
В следующем примере сравнивается преобразование секунд в строковых литералах в тип данных .
Входные данные | Вывод |
---|---|
2007-05-08 12:35:29 | 2007-05-08 12:35:00 |
2007-05-08 12:35:30 | 2007-05-08 12:36:00 |
2007-05-08 12:59:59.998 | 2007-05-08 13:00:00 |
Б. Сравнение типов данных даты и времени
В следующем примере сравниваются результаты приведения строкового типа к каждому из типов данных date и time.
Тип данных | Выходные данные |
---|---|
time | 12:35:29. 1234567 |
date | 2007-05-08 |
smalldatetime | 2007-05-08 12:35:00 |
datetime | 2007-05-08 12:35:29.123 |
datetime2 | 2007-05-08 12:35:29. 1234567 |
datetimeoffset | 2007-05-08 12:35:29.1234567 +12:15 |
Моделируем ситуацию
Для примера создадим консольное приложение EFMigrationsDateTimeDemo. С помощью NuGet установим библиотеку Entity Framework, выполнив команду:
PM> install-package EntityFramework
Теперь добавим Модель UserProfile:
Кроме того, потребуется класс контекста для работы с Entity Framework:
Затем разместим код работы с базой данных в методе Main:
Запустим приложение в первый раз для того, чтобы создать исходную базу данных
Обратите внимание, что используется соединение по умолчанию. При необходимости, можно задать параметры в App.Config
Последним шагом в подготовке будет активация механизма автоматической миграции следующей командой в консоли NuGet:
PM> Enable-Migrations -EnableAutomaticMigrations
В результате будет создан файл Migrations\Configuration.cs.
Преобразование данных типа Date и Time
При преобразовании в типы данных даты и времени SQL Server отбрасывает все значения, которые не распознаются как значения даты или времени. Сведения об использовании функций CAST и CONVERT c данными типов даты и времени см. в статье Функции CAST и CONVERT (Transact-SQL).
Преобразование типа smalldatetime в другие типы данных даты и времени
В этом разделе описывается, что происходит при преобразовании типа данных smalldatetime в другие типы даты и времени.
Для преобразования в тип date копируются год, месяц и день. Следующий код демонстрирует результаты преобразования значения в значение .
При преобразовании в тип time(n) копируются часы, минуты и секунды. Доли секунды устанавливаются в значение 0. Следующий код демонстрирует результаты преобразования значения в значение .
При преобразовании в тип datetime значение smalldatetime копируется в значение datetime. Доли секунды устанавливаются в значение 0. Следующий код демонстрирует результаты преобразования значения в значение .
Для преобразования в тип datetimeoffset(n) значение smalldatetime копируется в значение datetimeoffset(n) . Для долей секунды устанавливается значение 0; для смещения часового пояса устанавливается значение +00:0. Следующий код демонстрирует результаты преобразования значения в значение .
При преобразовании в тип datetime2(n) значение smalldatetime копируется в значение datetime2(n) . Доли секунды устанавливаются в значение 0. Следующий код демонстрирует результаты преобразования значения в значение .
Итого
- Дата и время в JavaScript представлены объектом Date. Нельзя создать «только дату» или «только время»: объекты всегда содержат и то, и другое.
- Счёт месяцев начинается с нуля (да, январь – это нулевой месяц).
- Дни недели в также отсчитываются с нуля, что соответствует воскресенью.
- Объект самостоятельно корректируется при введении значений, выходящих за рамки допустимых. Это полезно для сложения/вычитания дней/месяцев/недель.
- Даты можно вычитать, и разность возвращается в миллисекундах. Так происходит, потому что при преобразовании в число объект становится таймстампом.
- Используйте для быстрого получения текущего времени в формате таймстампа.
Учтите, что, в отличие от некоторых других систем, в JavaScript таймстамп в миллисекундах, а не в секундах.
Порой нам нужно измерить время с большей точностью. Собственными средствами JavaScript измерять время в микросекундах (одна миллионная секунды) нельзя, но в большинстве сред такая возможность есть. К примеру, в браузерах есть метод performance.now(), возвращающий количество миллисекунд с начала загрузки страницы с точностью до микросекунд (3 цифры после точки):
В Node.js для этого предусмотрен модуль и ряд других способов. Технически почти любое устройство или среда позволяет добиться большей точности, просто её нет в объекте .