Вычтите дни, месяцы, годы из даты в javascript

if else в одну строку

Во многих языках программирования условие может быть записано в одну строку. Например, в JavaScript используется тернарный оператор:

Читается это выражение так: если больше , равен , иначе — равен .

В Python отсутствует тернарный оператор

Вместо тернарного оператора, в Питоне используют инструкцию , записанную в виде выражения (в одно строку):

Пример:

Такая конструкция может показаться сложной, поэтому для простоты восприятия, нужно поделить ее на 3 блока:

Для простоты восприятия if-else, записанного одной строкой, разделите выражение на 3 блока

Стоит ли использовать такой синтаксис? Если пример простой, то однозначно да:

Вполне читаемо смотрятся и следующие 2 примера:

Но если вы используете несколько условий, сокращенная конструкция усложняется и становится менее читаемой:

Using versioning to control exposed and excluded properties⬆

If you are building an API that has different versions, class-transformer has extremely useful tools for that.
You can control which properties of your model should be exposed or excluded in what version. Example:

import { Exclude, Expose, classToPlain } from 'class-transformer';

export class User {
  id: number;

  name: string;

  @Expose({ since: 0.7, until: 1 }) // this means that this property will be exposed for version starting from 0.7 until 1
  email: string;

  @Expose({ since: 2.1 }) // this means that this property will be exposed for version starting from 2.1
  password: string;
}

let user1 = classToPlain(user, { version: 0.5 }); // will contain id and name
let user2 = classToPlain(user, { version: 0.7 }); // will contain id, name and email
let user3 = classToPlain(user, { version: 1 }); // will contain id and name
let user4 = classToPlain(user, { version: 2 }); // will contain id and name
let user5 = classToPlain(user, { version: 2.1 }); // will contain id, name and password

JS сравнение дат

В JavaScript для сравнения дат используются операторы , , и .

const earlier = new Date(2019, 0, 26)
const later = new Date(2019, 0, 27)
console.log(earlier < later) // true

Сложнее сравнить даты по времени суток (часам и минутам). Вы не сможете сравнить их с помощью или :

const a = new Date(2019, 0, 26)
const b = new Date(2019, 0, 26)

console.log(a == b) // false
console.log(a === b) // false

Чтобы проверить, совпадает ли в двух датах значение времени, нужно сравнить их временные метки с помощью .

const isSameTime = (a, b) => {
  return a.getTime() === b.getTime()
}
const a = new Date(2019, 0, 26)
const b = new Date(2019, 0, 26)
console.log(isSameTime(a, b)) // true

Чтобы проверить, совпадают ли в датах дни недели, сравните их значения  с помощью методов , и .

const isSameDay = (a, b) => {
  return a.getFullYear() === b.getFullYear() &&
    a.getMonth() === b.getMonth() &&
    a.getDate()=== b.getDate()
}
const a = new Date(2019, 0, 26, 10) // 26 января 2019, 10:00
const b = new Date(2019, 0, 26, 12) // 26 января 2019, 12:00
console.log(isSameDay(a, b)) // true

Как работает if else

Синтаксис

Оператор в языке Python — это типичная условная конструкция, которую можно встретить и в большинстве других языков программирования.

Синтаксически конструкция выглядит следующим образом:

  1. сначала записывается часть с условным выражением, которое возвращает истину или ложь;
  2. затем может следовать одна или несколько необязательных частей (в других языках вы могли встречать );
  3. Завершается же запись этого составного оператора также необязательной частью .

Принцип работы оператора выбора в Python

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

То есть интерпретатор начинает последовательное выполнение программы, доходит до и вычисляет значение сопутствующего условного выражения. Если условие истинно, то выполняется связанный с набор инструкций. После этого управление передается следующему участку кода, а все последующие части и часть (если они присутствуют) опускаются.

Отступы

Отступы — важная и показательная часть языка Python. Их смысл интуитивно понятен, а определить их можно, как размер или ширину пустого пространства слева от начала программного кода.

Благодаря отступам, python-интерпретатор определяет границы блоков. Все последовательно записанные инструкции, чье смещение вправо одинаково, принадлежат к одному и тому же блоку кода. Конец блока совпадает либо с концом всего файла, либо соответствует такой инструкции, которая предшествует следующей строке кода с меньшим отступом.

Таким образом, с помощью отступов появляется возможность создавать блоки на различной глубине вложенности, следуя простому принципу: чем глубже блок, тем шире отступ.

Подробнее о табуляции и отступах в Python:

Python табуляция (отступы)

Примеры

Рассмотрим несколько практических примеров использования условного оператора.

Пример №1: создание ежедневного бэкапа (например базы данных):

Пример №2: Проверка доступа пользователя к системе. В данном примере проверяет наличие элемента в списке:

Пример №3: Валидация входных данных. В примере к нам приходят данные в формате . Нам необходимо выбрать все записи определенного формата:

Property existence test, “in” operator

A notable feature of objects in JavaScript, compared to many other languages, is that it’s possible to access any property. There will be no error if the property doesn’t exist!

Reading a non-existing property just returns . So we can easily test whether the property exists:

There’s also a special operator for that.

The syntax is:

For instance:

Please note that on the left side of there must be a property name. That’s usually a quoted string.

If we omit quotes, that means a variable, it should contain the actual name to be tested. For instance:

Why does the operator exist? Isn’t it enough to compare against ?

Well, most of the time the comparison with works fine. But there’s a special case when it fails, but works correctly.

It’s when an object property exists, but stores :

In the code above, the property technically exists. So the operator works right.

Situations like this happen very rarely, because should not be explicitly assigned. We mostly use for “unknown” or “empty” values. So the operator is an exotic guest in the code.

Literals and properties

We can immediately put some properties into as “key: value” pairs:

A property has a key (also known as “name” or “identifier”) before the colon and a value to the right of it.

In the object, there are two properties:

  1. The first property has the name and the value .
  2. The second one has the name and the value .

The resulting object can be imagined as a cabinet with two signed files labeled “name” and “age”.

We can add, remove and read files from it any time.

Property values are accessible using the dot notation:

The value can be of any type. Let’s add a boolean one:

To remove a property, we can use operator:

We can also use multiword property names, but then they must be quoted:

The last property in the list may end with a comma:

That is called a “trailing” or “hanging” comma. Makes it easier to add/remove/move around properties, because all lines become alike.

Methods⬆

plainToClass

This method transforms a plain javascript object to instance of specific class.

import { plainToClass } from 'class-transformer';

let users = plainToClass(User, userJson); // to convert user plain object a single user. also supports arrays

plainToClassFromExist

This method transforms a plain object into an instance using an already filled Object which is an instance of the target class.

const defaultUser = new User();
defaultUser.role = 'user';

let mixedUser = plainToClassFromExist(defaultUser, user); // mixed user should have the value role = user when no value is set otherwise.

classToPlain

This method transforms your class object back to plain javascript object, that can be later.

import { classToPlain } from 'class-transformer';
let photo = classToPlain(photo);

classToClass

This method transforms your class object into a new instance of the class object.
This may be treated as deep clone of your objects.

import { classToClass } from 'class-transformer';
let photo = classToClass(photo);

You can also use an option in transformation options to ignore all decorators you classes is using.

serialize

You can serialize your model right to json using method:

import { serialize } from 'class-transformer';
let photo = serialize(photo);

works with both arrays and non-arrays.

deserialize and deserializeArray

You can deserialize your model from json using the method:

import { deserialize } from 'class-transformer';
let photo = deserialize(Photo, photo);

To make deserialization work with arrays, use the method:

import { deserializeArray } from 'class-transformer';
let photos = deserializeArray(Photo, photos);

Working with nested objects⬆

When you are trying to transform objects that have nested objects,
it’s required to known what type of object you are trying to transform.
Since Typescript does not have good reflection abilities yet,
we should implicitly specify what type of object each property contain.
This is done using decorator.

Lets say we have an album with photos.
And we are trying to convert album plain object to class object:

import { Type, plainToClass } from 'class-transformer';

export class Album {
  id: number;

  name: string;

  @Type(() => Photo)
  photos: Photo;
}

export class Photo {
  id: number;
  filename: string;
}

let album = plainToClass(Album, albumJson);
// now album is Album object with Photo objects inside

Providing more than one type option

In case the nested object can be of different types, you can provide an additional options object,
that specifies a discriminator. The discriminator option must define a that holds the subtype
name for the object and the possible that the nested object can converted to. A sub type
has a , that holds the constructor of the Type and the , that can match with the
of the discriminator.

Lets say we have an album that has a top photo. But this photo can be of certain different types.
And we are trying to convert album plain object to class object. The plain object input has to define
the additional property . This property is removed during transformation by default:

JSON input:

{
  "id": 1,
  "name": "foo",
  "topPhoto": {
    "id": 9,
    "filename": "cool_wale.jpg",
    "depth": 1245,
    "__type": "underwater"
  }
}
import { Type, plainToClass } from 'class-transformer';

export abstract class Photo {
  id: number;
  filename: string;
}

export class Landscape extends Photo {
  panorama: boolean;
}

export class Portrait extends Photo {
  person: Person;
}

export class UnderWater extends Photo {
  depth: number;
}

export class Album {
  id: number;
  name: string;

  @Type(() => Photo, {
    discriminator: {
      property: '__type',
      subTypes: 
        { value: Landscape, name: 'landscape' },
        { value: Portrait, name: 'portrait' },
        { value: UnderWater, name: 'underwater' },
      ,
    },
  })
  topPhoto: Landscape | Portrait | UnderWater;
}

let album = plainToClass(Album, albumJson);
// now album is Album object with a UnderWater object without `__type` property.

Hint: The same applies for arrays with different sub types. Moreover you can specify
in the options to keep the discriminator property also inside your resulting class.

Working with arrays⬆

When you are using arrays you must provide a type of the object that array contains.
This type, you specify in a decorator:

import { Type } from 'class-transformer';

export class Photo {
  id: number;

  name: string;

  @Type(() => Album)
  albums: Album;
}

You can also use custom array types:

import { Type } from 'class-transformer';

export class AlbumCollection extends Array<Album> {
  // custom array functions ...
}

export class Photo {
  id: number;

  name: string;

  @Type(() => Album)
  albums: AlbumCollection;
}

Library will handle proper transformation automatically.

ES6 collections and also require the decorator:

export class Skill {
  name: string;
}

export class Weapon {
  name: string;
  range: number;
}

export class Player {
  name: string;

  @Type(() => Skill)
  skills: Set<Skill>;

  @Type(() => Weapon)
  weapons: Map<string, Weapon>;
}

Working with nested objects⬆

When you are trying to transform objects that have nested objects,
it’s required to known what type of object you are trying to transform.
Since Typescript does not have good reflection abilities yet,
we should implicitly specify what type of object each property contain.
This is done using decorator.

Lets say we have an album with photos.
And we are trying to convert album plain object to class object:

import { Type, plainToClass } from 'class-transformer';

export class Album {
  id: number;

  name: string;

  @Type(() => Photo)
  photos: Photo;
}

export class Photo {
  id: number;
  filename: string;
}

let album = plainToClass(Album, albumJson);
// now album is Album object with Photo objects inside

Providing more than one type option

In case the nested object can be of different types, you can provide an additional options object,
that specifies a discriminator. The discriminator option must define a that holds the subtype
name for the object and the possible that the nested object can converted to. A sub type
has a , that holds the constructor of the Type and the , that can match with the
of the discriminator.

Lets say we have an album that has a top photo. But this photo can be of certain different types.
And we are trying to convert album plain object to class object. The plain object input has to define
the additional property . This property is removed during transformation by default:

JSON input:

{
  "id": 1,
  "name": "foo",
  "topPhoto": {
    "id": 9,
    "filename": "cool_wale.jpg",
    "depth": 1245,
    "__type": "underwater"
  }
}
import { Type, plainToClass } from 'class-transformer';

export abstract class Photo {
  id: number;
  filename: string;
}

export class Landscape extends Photo {
  panorama: boolean;
}

export class Portrait extends Photo {
  person: Person;
}

export class UnderWater extends Photo {
  depth: number;
}

export class Album {
  id: number;
  name: string;

  @Type(() => Photo, {
    discriminator: {
      property: '__type',
      subTypes: 
        { value: Landscape, name: 'landscape' },
        { value: Portrait, name: 'portrait' },
        { value: UnderWater, name: 'underwater' },
      ,
    },
  })
  topPhoto: Landscape | Portrait | UnderWater;
}

let album = plainToClass(Album, albumJson);
// now album is Album object with a UnderWater object without `__type` property.

Hint: The same applies for arrays with different sub types. Moreover you can specify
in the options to keep the discriminator property also inside your resulting class.

Создание даты

Вы можете создать дату, использовав оператор new:

  1. Со строкой даты.
  2. С аргументами даты.
  3. С меткой времени.
  4. Без аргументов.

Способ со строкой даты

Мы передаем строку даты в конструктор .

new Date('1988-03-21')

Но если вы передадите строковое представление даты в формате 21-03-1988, то получите ошибку.

new Date(’21-03-1988′) приводит к ошибке Invalid Date.

В JavaScript нужно использовать формат даты, который принят во всем мире —  ISO 8601.

// Расширенный формат ISO 8601
`YYYY-MM-DDTHH:mm:ss:sssZ`

Вот что означают значения:

  • : 4-значный год;
  • : двузначный месяц (где январь 01, а декабрь 12);
  • : двузначная дата (от 01 до 31);
  • : разделители даты;
  • : указывает на начало блока времени;
  • : часы в 24-часовом формате (от 00 до 23);
  • : минуты (от 00 до 59);
  • : секунды (от 00 до 59);
  • : миллисекунды (от 000 до 999);
  • : разделители времени;
  • : если присутствует, дата будет установлена в UTC. Если отсутствует, это будет местное время.

Часы, минуты, секунды и миллисекунды необязательны, если вы создаете дату. Если нужно передать дату 11 июня 2019 года:

new Date('2019-06-11')

Но если вы находитесь к востоку от Гринвича, то получите дату 10 июня.

new Date(‘2019-06-11’) выдаёт 10 июня, если вы находитесь к востоку от Гринвича

Если в районе, который опережает время по Гринвичу, то получите дату 11 июня.

new Date(‘2019-06-11’)выдаёт 11 июня, если вы находитесь к западу от Гринвича

Это происходит потому, что вы передаете дату без указания времени. В итоге JavaScript выводит дату, установленную в UTC.

Строка кода создает дату 11 июня 2019, 12:00 UTC. Вот почему люди, которые живут восточнее Гринвича, получают 10 июня вместо 11 июня.

Если вы хотите создать дату по местному часовому поясу, необходимо указать время. Когда вы включаете в дату время, вам нужно добавить, как минимум, часы и минуты (иначе Google Chrome возвращает недопустимую дату).

new Date('2019-06-11T00:00')

Дата по местному времени и дата в UTC.

Кстати, MDN предостерегает от использования строкового представления даты, поскольку браузеры могут ее трактовать по-разному.

MDN не рекомендует создавать даты с помощью строкового представления.

Создание дат с помощью аргументов

Конструктор Date принимает семь параметров:

  1. Год: четырехзначный год.
  2. Месяц: месяц года (0-11). По умолчанию 0.
  3. День: день месяца (1-31). По умолчанию 1.
  4. Час: час дня (0-23). По умолчанию 0.
  5. Минуты: Минуты (0-59). По умолчанию 0.
  6. Секунды: секунды (0-59). По умолчанию 0.
  7. Миллисекунды: миллисекунды (0-999). По умолчанию 0.
// 11 июня 2019г. 5:23:59 местного времени
new Date(2019, 5, 11, 5, 23, 59)

Многие разработчики избегают подхода с использованием аргументов, потому что он выглядит сложным. Но на самом деле все довольно просто.

new Date(2017, 3, 22, 5, 23, 50)
// Эту дату легко понять, если читать ее слева направо.
// Год: 2017
// Месяц: апрель (потому что месяца считаются с 0)
// Дата: 22
// Часы: 05
// Минут: 23
// Секунды: 50

Но помните, что порядок месяца начинаются с нуля. Например, январь – 0, февраль – 1, март – 2 и т. д.

Вот еще несколько примеров для закрепления:

// 21 марта 1988г. 00:00 местного времени
new Date(1988, 2, 21)
// 25 декабря 2019г. 8:00 местного времени 
new Date(2019, 11, 25, 8)
// 6 ноября 2023г. 2:20 местного времени
new Date(2023, 10, 6, 2, 20)
// 11 июня 2019г. 5:23:59 местного времени
new Date(2019, 5, 11, 5, 23, 59)

Даты, созданные с помощью аргументов, указаны по местному времени. Если вам понадобится дата в формате UTC, используйте следующий синтаксис:

// 11 июня 2019 00:00 UTC.
new Date(Date.UTC(2019, 5, 11))

Создание дат с помощью меток времени

В JavaScript метка времени – это количество миллисекунд, прошедших с 1 января 1970 г. (от начала эпохи Unix). Метки времени используются только для сравнения различных дат.

// 11 июня 2019 8:00 (по моему местному времени в Сингапуре)
new Date(1560211200000)

Без аргументов

Если использовать конструктор объекта Date() без аргументов, то он возвращает дату по местному времени.

new Date()

Текущее время.

Небольшие хитрости по набору нужного объема слов для английского эссе на ЕГЭ

Что ж, речевые клише для написания эссе по английскому языку мы все рассмотрели, но для особо любознательных школьников у нас припасена еще одна хитрость. Как известно, экзаменационные сочинения пишут по строгому регламенту, и, в частности, там есть требование к объемам текста. Для письменного задания на ЕГЭ по английскому 2020 требования остались прежними: сочинение должно укладываться в рамки 200-250 слов. При этом действует правило -10% в меньшую сторону, т.е. работу засчитывают, если в ней насчитывается не менее 180 слов. Если же ваш текст перешел планку в 250, то все, что после этой цифры учитываться для оценки не будет.

Но мы сейчас рассмотрим обратную ситуацию. Как писать эссе по английскому, когда даже с клише не хватает слов до нужного объема? Действительно, не все же школьники многословные и любят делиться своими мыслями. Если вы подсчитали слова, и понимаете, что ваш образец эссе на ЕГЭ по английскому не дотягивает до нужного объема, – не спешите паниковать и переписывать текст. Лучше вспомните о такой полезной вещи, как вводные слова. Эти выражения можно добавить почти в любой рассказ, при этом не исказив его смысл и стилистику. Рассмотрим список таких слов.

Вводные слова
In today’s world В современном мире
Hence Следовательно
Besides/furthermore Кроме того
Thus Таким образом
Unfortunately К сожалению
Most of all Больше всего
In other words Иначе говоря, другими словами
Also Также, тоже
In a word Одним словом
I would like to Мне бы хотелось…
In addition В дополнение, к тому же, в добавок
As a result of В результате
Concerning Касательно

Такую табличку тоже советуем носить при себе и постепенно заучивать. Как знать, может именно вводная фраза посодействует в успешной сдаче экзамена.

Советуем также посмотреть материал про 1000 слов на английском, которые нужно знать, обязательно пригодится при подготовке к экзамену и просто изучении английского!

Ни пуха, ни пера!

Просмотры: 8 911

Skipping private properties, or some prefixed properties⬆

If you name your private properties with a prefix, lets say with ,
then you can exclude such properties from transformation too:

import { classToPlain } from 'class-transformer';
let photo = classToPlain(photo, { excludePrefixes: '_' });

This will skip all properties that start with prefix.
You can pass any number of prefixes and all properties that begin with these prefixes will be ignored.
For example:

import { Expose, classToPlain } from 'class-transformer';

export class User {
  id: number;
  private _firstName: string;
  private _lastName: string;
  _password: string;

  setName(firstName: string, lastName: string) {
    this._firstName = firstName;
    this._lastName = lastName;
  }

  @Expose()
  get name() {
    return this._firstName + ' ' + this._lastName;
  }
}

const user = new User();
user.id = 1;
user.setName('Johny', 'Cage');
user._password = '123';

const plainUser = classToPlain(user, { excludePrefixes: '_' });
// here plainUser will be equal to
// { id: 1, name: "Johny Cage" }

Using groups to control excluded properties⬆

You can use groups to control what data will be exposed and what will not be:

import { Exclude, Expose, classToPlain } from 'class-transformer';

export class User {
  id: number;

  name: string;

  @Expose({ groups: 'user', 'admin' }) // this means that this data will be exposed only to users and admins
  email: string;

  @Expose({ groups: 'user' }) // this means that this data will be exposed only to users
  password: string;
}

let user1 = classToPlain(user, { groups: 'user' }); // will contain id, name, email and password
let user2 = classToPlain(user, { groups: 'admin' }); // will contain id, name and email

Получение отдельных компонентов даты и времени

В JavaScript для получения отдельных компонентов даты и времени предназначены следующие методы:

  • – возвращает год, состоящий из 4 чисел;
  • – возвращает месяц в формате числа от 0 до 11 (0 – январь, 1 – февраль, 2 – март, …, 11 – декабрь);
  • – возвращает число месяца от 1 до 31;
  • – возвращает количество часов от 0 до 23;
  • – возвращает количество минут от 0 до 59;
  • – возвращает количество секунд от 0 до 59;
  • – возвращает количество миллисекунд от 0 до 999.

Все эти методы возвращают отдельные компоненты даты и времени в соответствии с часовым поясом установленном на локальном устройстве пользователя.

Пример:

// создадим дату 11.11.2019 00:00 по UTC
var newDate = new Date(Date.UTC(2019,11,11));

// получим компоненты даты, если на устройстве пользователя местное время равно UTC+10:00
newDate.getFullYear(); //2019
newDate.getMonth(); // 10
newDate.getDate(); // 11
newDate.getHours(); // 10
newDate.getMinutes(); // 0
newDate.getSeconds(); // 0
newDate.getMilliseconds(); // 0

Пример, в котором поприветствуем пользователя в зависимости от того какой сейчас у него интервал времени:

// получим текущее время пользователя и компоненты этого времени
var 
  now = new Date(),
  hour = now.getHours(),
  minute = now.getMinutes(),
  second = now.getSeconds(),
  message = '';

// определим фразу приветствия в зависимости от местного времени пользователя 
if (hour <= 6) {
  message = 'Доброе время суток';
} else if (hour <= 12) {
  message = 'Доброе утро';
} else if (hour <= 18) {
  message = 'Добрый день';
} else {
  message = 'Добрый вечер';
}

// выполним форматирование времени с использованием тернарного оператора
minute = (minute < 10) ? '0' + minute : minute;
second = (second < 10) ? '0' + second : second;
hour = (hour < 10) ? '0' + hour : hour;

message += ', сейчас ' + hour + ':' + minute + ':' + second;

// выведем приветствие и время в консоль
console.log(message); // Добрый вечер, сейчас 22:50:39

В этом примере вывод времени в нужном формате осуществлён с использованием тернарного оператора.

В JavaScript имеются аналоги этих методов для получения отдельных компонентов даты и времени для часового пояса UTC+0. Эти методы называются аналогично, но с добавленным «UTC» после «get»: , , , , , , .

Получить номер дня недели в JavaScript можно с помощью метода .

Данный метод возвращает число от 0 до 6 (0 – воскресенье, 1 – понедельник, …, 6 – суббота).

Пример, в котором переведём день недели из числового в строковое представление:

var days =;

// получим текущую дату
var now = new Date();
// выведем в консоль день недели
console.log('Сегодня ' + days);

Получить количество миллисекунд прошедших с 01.01.1970 00:00:00 UTC в JavaScript можно с помощью метода .

Узнать разницу (в минутах) между часовым поясом локального устройства и UTC в JavaScript можно с помощью метода .

Other decorators⬆

Signature Example Description
Transform the method return with classToPlain and expose the properties on the class.
Transform the method return with classToClass and expose the properties on the class.
Transform the method return with plainToClass and expose the properties on the class.

The above decorators accept one optional argument:
ClassTransformOptions — The transform options like groups, version, name

An example:

@Exclude()
class User {
  id: number;

  @Expose()
  firstName: string;

  @Expose()
  lastName: string;

  @Expose({ groups: 'user.email' })
  email: string;

  password: string;
}

class UserController {
  @TransformClassToPlain({ groups: 'user.email' })
  getUser() {
    const user = new User();
    user.firstName = 'Snir';
    user.lastName = 'Segal';
    user.password = 'imnosuperman';

    return user;
  }
}

const controller = new UserController();
const user = controller.getUser();
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: