Числа и даты
============

* « Предыдущая статья
* Следующая статья »

Данный раздел представляет собой введение в работу с числами и датами в JavaScript.

Числа
-----

В JavaScript все числа являются числами двойной точности в соответствии с 64-битным двоичным форматом IEEE 754 (т.е. числами, принадлежащими диапазону между -(253 -1) и 253 -1). **Целые числа не рассматриваются как отдельный тип чисел**. В дополнение к числам с плавающей запятой, к числовому типу данных относятся также три символьные величины: `+``бесконечность`, `-``бесконечность`, и `NaN` (не-число). В разделе типы и структуры данных в JavaScript числовой тип данных описан в контексте с другими примитивными типами в JavaScript.

Вы можете использовать четыре типа числовых литералов: десятичный, двоичный, восьмеричный и шестнадцатеричный.

### Десятичные числа


```js
1234567890;
42;

// Будьте внимательны при использование нулей в начале чисел:

0888; // 888 обрабатывается как десятичное
0777; // обрабатывается как восьмеричное в нестрогой форме (511 в десятичной)
```


Обратите внимание, что десятичные литералы могут начинаться с нуля (`0`) за которым следует другая десятичная цифра, но если следующая за нулём цифра меньше 8, то число обрабатывается как восьмеричное.

### Двоичные числа

Синтаксис двоичных чисел использует ведущий 0 за которым следует латинская буква "B" в верхнем или нижнем регистре (`0b` or `0B`). Если цифры после `0b` не являются 0 или 1, то будет сгенерированно `SyntaxError` с сообщением: "Missing binary digits after 0b".


```js
var FLT\_SIGNBIT = 0b10000000000000000000000000000000; // 2147483648
var FLT\_EXPONENT = 0b01111111100000000000000000000000; // 2139095040
var FLT\_MANTISSA = 0b00000000011111111111111111111111; // 8388607
```

### Восьмеричные числа

Синтаксис восьмеричных чисел использует ноль в начале. Если цифры после 0 не входят в диапазон от 0 до 7, число будет интерпретировано как десятичное.


```js
var n = 0755; // 493
var m = 0644; // 420
```

### Шестнадцатеричные числа

Синтаксис шестнадцатеричных чисел использует ведущий 0 за которым следует латинская буква "X" в верхнем или нижнем регистре (`0x` or `0X`). Если цифры после 0x не входят в диапазон (0123456789ABCDEF), то будет сгенерированно `SyntaxError` с сообщением: "Identifier starts immediately after numeric literal".


```js
0xfffffffffffffffff; // 295147905179352830000
0x123456789abcdef; // 81985529216486900
0xa; // 10
```

Объект Number
-------------

У этого встроенного объекта `Number` есть свойства для целочисленных констант, таких как максимальное число, не-число и бесконечность. Вы не можете изменить значения этих свойств, и вы должны использовать их следующим образом:


```js
var biggestNum = Number.MAX\_VALUE;
var smallestNum = Number.MIN\_VALUE;
var infiniteNum = Number.POSITIVE\_INFINITY;
var negInfiniteNum = Number.NEGATIVE\_INFINITY;
var notANum = Number.NaN;
```


Как видно из примера выше, для получения перечисленных значений, нужно обращаться к свойствам предопределённого глобального объекта `Number`. Тогда как у экземпляра этого объекта, созданного вами при работе программы, этих свойств не будет.

В следующей таблице приведён список свойств объекта `Number`.

| Свойство | Описание |
| --- | --- |
| `Number.MAX_VALUE` | Наибольшее число из возможных для представления |
| `Number.MIN_VALUE` | Наименьшее число из возможных для представления |
| `Number.NaN` | Специальное "Не числовое" ("not a number") значение |
| `Number.NEGATIVE_INFINITY` | Специальное значение "Минус бесконечность"; возвращается при переполнении |
| `Number.POSITIVE_INFINITY` | Специальное значение "Плюс бесконечность"; возвращается при переполнении |
| `Number.EPSILON` | Разница между единицей и наименьшим значением, большим единицы, которое может быть представлено типом `Number`. |
| `Number.MIN_SAFE_INTEGER` | Минимальное целое, безопасное число в JavaScript. |
| `Number.MAX_SAFE_INTEGER` | Максимальное целое, безопасное число в JavaScript. |

| Метод | Описание |
| --- | --- |
| `Number.parseFloat()` | Принимает строку как аргумент, и возвращает числовое значение с плавающей точкой, которое удалось распознать. Тоже самое что и глобальная функция `parseFloat()`. |
| `Number.parseInt()` | Принимает строку как аргумент, и возвращает целочисленное значение в заданной системе исчисления, которое удалось распознать. Тоже самое что и глобальная функция `parseInt()`. |
| `Number.isFinite()` | Определяет, является ли число, переданное в качестве аргумента, конечным. |
| `Number.isInteger()` | Определяет, является ли число, переданное в качестве аргумента, целым. |
| `Number.isNaN()` | Определяет, является ли число, переданное в качестве аргумента, `NaN` (не числом). Аналогичный, но более надёжный метод чем глобальная функция `isNaN()`. |
| `Number.isSafeInteger()` | Определяет, является ли .число, переданное в качестве аргумента, целым и безопасным. |

`Прототип Number` предоставляет ряд методов, для получения значения числа в различных форматах. В следующей таблице перечислены методы, доступные через `Number.prototype`.

| Метод | Описание |
| --- | --- |
| `toExponential()` | Возвращает строку, представляющую число в экспоненциальном представлении. |
| `toFixed()` | Возвращает строку, представляющую число с заданным количеством разрядов после запятой. |
| `toPrecision()` | Возвращает строку, представляющую число с указанной точностью. |

`Объект Math`
-------------

Встроенный глобальный объект `Math` содержит свойства и методы для математических констант и функций. Например, свойство объекта `Math` `PI` содержит значение математической константы "Пи" (3.141...), которые вы можете использовать в программе как


```js
Math.PI;
```


Подобным образом, математические функции являются методами объекта `Math`. Они включают тригонометрические, логорифмические, экспоненциальные и другие функции. Например, если вы хотите использовать тригонометрическую функцию синуса, вы напишете следующий код


```js
Math.sin(1.56);
```


Заметьте, что все тригонометрические методы объекта `Math` принимают аргументы в радианах.

В следующей таблице перечислены методы объекта `Math`.

| Метод | Описание |
| --- | --- |
| `abs()` | Возвращает абсолютное значение (модуль) аргумента |
| `sin()`, `cos()`, `tan()` | Стандартные тригонометрические функции; принимают аргументы в радианах |
| `asin()`, `acos()`, `atan()`, `atan2()` | Обратные тригонометрические функции; возвращают значения в радианах |
| `sinh()`, `cosh()`, `tanh()` | Гиперболические тригонометрические функции; принимают аргументы в гиперболических углах |
| `asinh()`, `acosh()`, `atanh()` | Обратные гиперболические тригонометрические функции; возвращают значения в гиперболических углах |
| `pow()`, `exp()`, `expm1()`, `log10()`, `log1p()`, `log2()` | Экспоненциальные и логорифмические функции |
| `floor()`, `ceil()` | Возвращают наибольшее/наименьшее целое, которое меньше/больше или равно входному значению |
| `min()`, `max()` | Возвращают наибольшее или наименьшее (соответственно) из входных числовых значений, перечисленных через запятую |
| `random()` | Возвращает случайное число от 0 до 1 |
| `round()`, `fround()`, `trunc()`, | Функции округления и отсечения дробной части |
| `sqrt()`, `cbrt()`, `hypot()` | Корень квадратный, корень кубический, корень квадратный из суммы квадратов аргументов |
| `sign()` | Знак числа, показывает является ли входное число позитивным, негативным или равным нулю |
| `clz32()`, `imul()` | Количество первых нулевых бит в 32-битном двоичном представлении. Возвращает результат Си-подобного 32-битного целочисленного умножения двух аргументов. |

В отличии от большинства других объектов, вам не нужно создавать свои экземпляры объекта `Math`. Всегда следует использовать глобальный объект `Math` непосредственно.

`Объект Date`
-------------

JavaScript не имеет отдельного типа данных для хранения дат. Однако, вы можете использовать объект `Date` и его методы для работы с датами и временем в вашем приложении. Объект `Date` имеет большое количество методов для записи, чтения и оперирования датой и временем, а свойств не имеет ни одного.

JavaScript оперирует датами во многом аналогично языку Java. Для работы с датой эти два языка имеют множество одинаковых методов, и оба они хранят даты как количество миллисекунд, прошедших с 00:00:00 1 Января 1970 года.

Период значений, которые может принимать Data, простирается от -100 000 000 до100 000 000 дней, относительно 1 Января 1970 года.

Чтобы создать свой экземпляр объекта `Date используйте такой код`:


```js
var dateObjectName = new Date([parameters]);
```


где `dateObjectName` это имя переменной, которой будет присвоено созданное значение с типом `Date`; вместо этой переменной, присвоить созданное значение можно как свойство, любому существующему объекту.

Вызов `Date` как функции, без ключевого слова `new,` возвращает текущую дату и время в виде текстовой строки.

Содержимым блока `parameters` в коде представленном выше, могут выступать любая из следующих конструкций:

* Пусто: создаёт текущую дату и время. Пример: `today = new Date();`.
* Текстовая строка, содержащая дату и время в следующем формате: "Месяц день, год часы:минуты:секунды". Например: `var Xmas95 = new Date("December 25, 1995 13:30:00")`. Если не указать секунды, минуты или часы, то их значение будет принято за 0.
* Набор целочисленных значений для года, месяца и дня. Например: `var Xmas95 = new Date(1995, 11, 25)`.
* Набор целочисленных значений для года, месяца, дня, часов, минут и секунд. Например: `var Xmas95 = new Date(1995, 11, 25, 9, 30, 0);`.
### Получение даты в русскоязычном формате
```

new Date().toLocaleString('ru',
  {
    day: 'numeric',
    month: 'long',
    year: 'numeric'
  });
// текущая дата в формате: '10 января 2019 г.'
```


Подробнее про метод toLocalString

### Методы объекта `Date`

Методы объекта `Date` для работы с датой и временем делятся на следующие категории:

* "set" методы, служат для установки параметров объекта `Date`.
* "get" методы, служат для получения параметров объекта `Date`.
* "to" методы, служат для получения значения объекта `Date` в текстовом виде.
* "parse" и UTC методы, служат для распознавания дат и времени из текстового формата.

При помощи методов групп "get" и"set", вы можете получить и установить значения секунд, минут, часов, дня месяца, дня недели, месяца и года по отдельности. Отдельно выделим метод `getDay`, который возвращает день недели, однако соответствующего ему метода `setDay` не существует, потому-что день недели высчитывается автоматически. Все эти методы используют в своей работе целочисленные значения по следующим правилам:

* Секунды и минуты: от 0 до 59
* Часы: от 0 до 23
* Дни недели: от 0 (Воскресенье) до 6 (Суббота)
* Дни месяца: от 1 до 31
* Месяцы: от 0 (Январь) до 11 (Декабрь)
* Год: год относительно 1900 года.

Например, предположим, что вы определили дату следующим образом:


```js
var Xmas95 = new Date("December 25, 1995");
```


Тогда `Xmas95.getMonth()` вернёт 11, а `Xmas95.getFullYear()` вернёт 1995.

Методы `getTime` и `setTime могут быть` полезны при сравнении дат. Метод `getTime` возвращает количество миллисекунд, прошедших с 00:00:00 1 Января, 1970 года.

Для примера рассмотрим следующий код, показывающий количество дней оставшихся до конца текущего года:


```js
var today = new Date(); // Получаем текущую дату
var endYear = new Date(1995, 11, 31, 23, 59, 59, 999); // Устанавливаем месяц и день на конец года
endYear.setFullYear(today.getFullYear()); // Устанавливаем текущий год
var msPerDay = 24 \* 60 \* 60 \* 1000; // Количество миллисекунд в одних сутках
var daysLeft = (endYear.getTime() - today.getTime()) / msPerDay;
var daysLeft = Math.round(daysLeft); // возвращает количество дней, оставшихся до конца года
```


Этот пример создаёт объект `Date` названный `today, который содержит текущую дату и время`. Затем, создаётся вспомогательный `Date` объект, названный `endYear,` которому устанавливаются значения, указывающие на конец года. После этого, при помощи рассчитанного количества миллисекунд в сутках, вычисляется количество дней между `today` и `endYear`, При этом используются метод `getTime` и округление, для получения количества полных дней.

Метод `parse` полезен для присвоения значений существующим объектам `Date` из текстового формата. Например, следующий код использует методы `parse` и `setTime` чтобы установить значение переменной `IPOdate`:


```js
var IPOdate = new Date();
IPOdate.setTime(Date.parse("Aug 9, 1995"));
```

### Пример

В следующем примере приведена функция `JSClock(), которая возвращает время в формате электронных часов:`


```js
function JSClock() {
  var time = new Date();
  var hour = time.getHours();
  var minute = time.getMinutes();
  var second = time.getSeconds();
  var temp = "" + (hour > 12 ? hour - 12 : hour);
  if (hour == 0) temp = "12";
  temp += (minute < 10 ? ":0" : ":") + minute;
  temp += (second < 10 ? ":0" : ":") + second;
  temp += hour >= 12 ? " P.M." : " A.M.";
  return temp;
}
```


Первым делом, функция JSClock создаёт новый объект `Date`, названный `time`; так как объект создаётся баз параметров, переменная `time` содержит текущую дату и время. Затем вызываются методы `getHours`, `getMinutes` и `getSeconds`, чтобы установить значения переменным `hour`, `minute` и `second`.

Следующие четыре выражения строят текстовую строку на основе time. Первое из них создаёт переменную `temp`, присваивая ей значение при помощи условия; Если `hour` больше чем 12, то (`hour - 12`), иначе просто `hour.` В случае же, когда `hour` равно 0, берётся фиксированное значение "12".

Следующее выражение приращивает минуты к переменной `temp`. Если количество минут меньше 10, то условное выражение добавляет строку с двоеточием и заполняющим нулём, иначе, просто строку с двоеточием. Секунды приращиваются к переменной `temp` тем же путём.

В завершение всего, последнее условное выражение добавляет строку "P.M." к переменной `temp` если `hour` равно или больше 12, иначе, добавляется строка "A.M.".

* « Предыдущая статья
* Следующая статья »