āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ NTP āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ˛ā§‡āĻ–āĻž

āĻšā§āĻ¯āĻžāĻ˛ā§‹ āĻšā§āĻ¯āĻžāĻŦā§āĻ°āĻžāĻ¸āĻžāĻ°ā§āĻ¸āĨ¤ āĻ†āĻœ āĻ†āĻŽāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻœā§‡āĻ° āĻ¸āĻšāĻœ NTP āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻ¤ā§‡ āĻšāĻžāĻ‡. āĻŽā§‚āĻ˛āĻ¤, āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨āĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻ—āĻ āĻ¨ āĻāĻŦāĻ‚ NTP āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¤āĻžāĻ° āĻĻāĻŋāĻ•ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯āĻžāĻŦā§‡āĨ¤ āĻ•ā§‹āĻĄāĻŸāĻŋ āĻĒāĻžāĻ‡āĻĨāĻ¨ā§‡ āĻ˛ā§‡āĻ–āĻž āĻšāĻŦā§‡, āĻ•āĻžāĻ°āĻŖ, āĻ†āĻŽāĻžāĻ° āĻŽāĻ¤ā§‡, āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻœāĻŋāĻ¨āĻŋāĻ¸ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻ° āĻ•ā§‹āĻ¨ āĻ­āĻžāĻ˛ā§‹ āĻ­āĻžāĻˇāĻž āĻ¨ā§‡āĻ‡āĨ¤ Connoisseurs ntplib āĻ•ā§‹āĻĄā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•ā§‹āĻĄā§‡āĻ° āĻŽāĻŋāĻ˛ā§‡āĻ° āĻĻāĻŋāĻ•ā§‡ āĻŽāĻ¨ā§‹āĻ¯ā§‹āĻ— āĻĻā§‡āĻŦā§‡āĻ¨ - āĻ†āĻŽāĻŋ āĻāĻŸāĻŋ āĻĻā§āĻŦāĻžāĻ°āĻž "āĻ…āĻ¨ā§āĻĒā§āĻ°āĻžāĻŖāĻŋāĻ¤" āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĨ¤

āĻ¤āĻžāĻ‡ NTP āĻ•āĻŋ āĻ¯āĻžāĻ‡āĻšā§‹āĻ•? NTP āĻšāĻ˛ āĻ¸āĻŽāĻ¯āĻŧ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ—ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛āĨ¤ āĻāĻ‡ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻ…āĻ¨ā§‡āĻ• āĻ†āĻ§ā§āĻ¨āĻŋāĻ• āĻŽā§‡āĻļāĻŋāĻ¨ā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻœā§‡āĻ° w32tm āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĨ¤

NTP āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŽā§‹āĻŸ 5 āĻŸāĻŋ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻĒā§āĻ°āĻĨāĻŽ, āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ 0 (1985, RFC958) āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§‡ āĻ…āĻĒā§āĻ°āĻšāĻ˛āĻŋāĻ¤ āĻŦāĻ˛ā§‡ āĻŦāĻŋāĻŦā§‡āĻšāĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻ¨āĻ¤ā§āĻ¨āĻ—ā§āĻ˛āĻŋ āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧ, 1āĻŽ (1988, RFC1059), 2āĻ¯āĻŧ (1989, RFC1119), 3āĻ¯āĻŧ (1992, RFC1305) āĻāĻŦāĻ‚ āĻšāĻ¤ā§āĻ°ā§āĻĨ (4, RFC1996)āĨ¤ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ 2030-1 āĻāĻ•ā§‡ āĻ…āĻĒāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻžāĻŽāĻžā§āĻœāĻ¸ā§āĻ¯āĻĒā§‚āĻ°ā§āĻŖ, āĻ¤āĻžāĻ°āĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽā§‡ āĻ­āĻŋāĻ¨ā§āĻ¨āĨ¤

āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸

āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ NTP āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ˛ā§‡āĻ–āĻž

āĻ˛āĻŋāĻĒ āĻ¸ā§‚āĻšāĻ• (āĻ¸āĻ‚āĻļā§‹āĻ§āĻ¨ āĻ¸ā§‚āĻšāĻ•) āĻāĻŽāĻ¨ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻ¯āĻž āĻ˛āĻŋāĻĒ āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄ āĻ¸āĻ¤āĻ°ā§āĻ•āĻ¤āĻž āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°ā§‡āĨ¤ āĻ…āĻ°ā§āĻĨ:

  • 0 - āĻ•ā§‹āĻ¨ āĻ¸āĻ‚āĻļā§‹āĻ§āĻ¨ āĻ¨ā§‡āĻ‡
  • 1 - āĻĻāĻŋāĻ¨ā§‡āĻ° āĻļā§‡āĻˇ āĻŽāĻŋāĻ¨āĻŋāĻŸā§‡ 61 āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄ āĻĨāĻžāĻ•ā§‡
  • 2 - āĻĻāĻŋāĻ¨ā§‡āĻ° āĻļā§‡āĻˇ āĻŽāĻŋāĻ¨āĻŋāĻŸā§‡ 59 āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄ āĻĨāĻžāĻ•ā§‡
  • 3 - āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻŦā§āĻ¯āĻ°ā§āĻĨāĻ¤āĻž (āĻ¸āĻŋāĻ™ā§āĻ•ā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻļā§‡āĻˇ)

āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻ¨āĻŽā§āĻŦāĻ° (āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻ¨āĻŽā§āĻŦāĻ°) – NTP āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻ¨āĻŽā§āĻŦāĻ° (1-4)āĨ¤

āĻŽā§‹āĻĄ (āĻŽā§‹āĻĄ) — āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒā§āĻ°ā§‡āĻ°āĻ•ā§‡āĻ° āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻ¨ āĻŽā§‹āĻĄāĨ¤ āĻŽāĻžāĻ¨ 0 āĻĨā§‡āĻ•ā§‡ 7, āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ:

  • 3 - āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ
  • 4 - āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°
  • 5 - āĻ¸āĻŽā§āĻĒā§āĻ°āĻšāĻžāĻ° āĻŽā§‹āĻĄ

āĻ¸ā§āĻŸā§āĻ°ā§‡āĻŸāĻžāĻŽ (āĻ˛ā§‡āĻ¯āĻŧāĻžāĻ°āĻŋāĻ‚ āĻ˛ā§‡āĻ­ā§‡āĻ˛) - āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻāĻŦāĻ‚ āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸ āĻ˜āĻĄāĻŧāĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻŽāĻ§ā§āĻ¯āĻŦāĻ°ā§āĻ¤ā§€ āĻ¸ā§āĻ¤āĻ°ā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž (1 - āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸ āĻ˜āĻĄāĻŧāĻŋ āĻĨā§‡āĻ•ā§‡ āĻĄā§‡āĻŸāĻž āĻ¨ā§‡āĻ¯āĻŧ, 2 - āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°āĻŸāĻŋ āĻ¸ā§āĻ¤āĻ° 1 āĻ¸āĻš āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻĄā§‡āĻŸāĻž āĻ¨ā§‡āĻ¯āĻŧ, āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋ)āĨ¤
āĻĒā§āĻ˛ āĻ•ā§āĻ°āĻŽāĻžāĻ—āĻ¤ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸āĻ°ā§āĻŦāĻžāĻ§āĻŋāĻ• āĻŦā§āĻ¯āĻŦāĻ§āĻžāĻ¨ā§‡āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻ¨āĻŋāĻ§āĻŋāĻ¤ā§āĻŦāĻ•āĻžāĻ°ā§€ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻŦāĻžāĻ•ā§āĻˇāĻ°āĻŋāĻ¤ āĻĒā§‚āĻ°ā§āĻŖāĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĨ¤ NTP āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻāĻ–āĻžāĻ¨ā§‡ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°ā§‡ āĻ¯ā§‡ āĻŦā§āĻ¯āĻŦāĻ§āĻžāĻ¨ā§‡ āĻāĻŸāĻŋ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻĒā§‹āĻ˛ āĻ•āĻ°āĻžāĻ° āĻ†āĻļāĻž āĻ•āĻ°ā§‡, āĻāĻŦāĻ‚ NTP āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ¸ā§‡āĻ‡ āĻŦāĻŋāĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°ā§‡ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻāĻŸāĻŋ āĻĒā§‹āĻ˛ āĻšāĻ“āĻ¯āĻŧāĻžāĻ° āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻļāĻž āĻ•āĻ°ā§‡āĨ¤ āĻŽāĻžāĻ¨āĻŸāĻŋ āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄā§‡āĻ° āĻŦāĻžāĻ‡āĻ¨āĻžāĻ°āĻŋ āĻ˛āĻ—āĻžāĻ°āĻŋāĻĻāĻŽā§‡āĻ° āĻ¸āĻŽāĻžāĻ¨āĨ¤
āĻ¸ā§āĻĒāĻˇā§āĻŸāĻ¤āĻž (āĻ¨āĻŋāĻ°ā§āĻ­ā§āĻ˛āĻ¤āĻž) āĻšāĻ˛ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻŦāĻžāĻ•ā§āĻˇāĻ°āĻŋāĻ¤ āĻĒā§‚āĻ°ā§āĻŖāĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻ¯āĻž āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ˜āĻĄāĻŧāĻŋāĻ° āĻ¨āĻŋāĻ°ā§āĻ­ā§āĻ˛āĻ¤āĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻ¨āĻŋāĻ§āĻŋāĻ¤ā§āĻŦ āĻ•āĻ°ā§‡āĨ¤ āĻŽāĻžāĻ¨āĻŸāĻŋ āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄā§‡āĻ° āĻŦāĻžāĻ‡āĻ¨āĻžāĻ°āĻŋ āĻ˛āĻ—āĻžāĻ°āĻŋāĻĻāĻŽā§‡āĻ° āĻ¸āĻŽāĻžāĻ¨āĨ¤
āĻŽā§‚āĻ˛ āĻŦāĻŋāĻ˛āĻŽā§āĻŦ (āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ˛ā§‡āĻŸā§‡āĻ¨ā§āĻ¸āĻŋ) āĻšāĻ˛ āĻāĻ¨āĻŸāĻŋāĻĒāĻŋ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻĒā§ŒāĻāĻ›āĻ¤ā§‡ āĻ˜āĻĄāĻŧāĻŋāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ˛āĻžāĻ—ā§‡, āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ-āĻŦāĻŋāĻ¨ā§āĻĻā§ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻšāĻŋāĻ¸āĻžāĻŦā§‡āĨ¤
āĻŽā§‚āĻ˛ āĻŦāĻŋāĻšā§āĻ›ā§āĻ°āĻŖ (āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻŸāĻžāĻ°) - āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ-āĻŦāĻŋāĻ¨ā§āĻĻā§ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻšāĻŋāĻ¸āĻžāĻŦā§‡ NTP āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ˜āĻĄāĻŧāĻŋāĻ° āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻŸāĻžāĻ°āĨ¤
āĻ°ā§‡āĻĢ āĻ†āĻ‡āĻĄāĻŋ (āĻ¸ā§‹āĻ°ā§āĻ¸ āĻ†āĻ‡āĻĄāĻŋ) – āĻ“āĻ¯āĻŧāĻžāĻš āĻ†āĻ‡āĻĄāĻŋāĨ¤ āĻ¯āĻĻāĻŋ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻ¸ā§āĻŸā§āĻ°ā§āĻ¯āĻžāĻŸāĻžāĻŽ 1 āĻĨāĻžāĻ•ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ°ā§‡āĻĢ āĻ†āĻ‡āĻĄāĻŋ āĻšāĻ˛ āĻĒāĻžāĻ°āĻŽāĻžāĻŖāĻŦāĻŋāĻ• āĻ˜āĻĄāĻŧāĻŋāĻ° āĻ¨āĻžāĻŽ (4 ASCII āĻ…āĻ•ā§āĻˇāĻ°)āĨ¤ āĻ¯āĻĻāĻŋ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ…āĻ¨ā§āĻ¯ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ°ā§‡āĻĢ āĻ†āĻ‡āĻĄāĻŋāĻ¤ā§‡ āĻāĻ‡ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻĨāĻžāĻ•ā§‡āĨ¤
āĻļā§‡āĻˇ 4āĻŸāĻŋ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ° āĻšāĻ˛ āĻ¸āĻŽāĻ¯āĻŧ - 32 āĻŦāĻŋāĻŸ - āĻĒā§‚āĻ°ā§āĻŖāĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻ…āĻ‚āĻļ, 32 āĻŦāĻŋāĻŸ - āĻ­āĻ—ā§āĻ¨āĻžāĻ‚āĻļ āĻ…āĻ‚āĻļāĨ¤
āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– - āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻ¸āĻ°ā§āĻŦāĻļā§‡āĻˇ āĻ˜āĻĄāĻŧāĻŋāĨ¤
āĻ‰ā§ŽāĻĒāĻ¤ā§āĻ¤āĻŋ - āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻ¸āĻŽāĻ¯āĻŧ (āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§‚āĻ°ā§āĻŖ - āĻ¨ā§€āĻšā§‡ āĻāĻŸāĻŋ āĻ†āĻ°āĻ“)āĨ¤
āĻ¨āĻŋāĻ¨ - āĻ¯āĻ–āĻ¨ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻ—ā§ƒāĻšā§€āĻ¤ āĻšāĻ¯āĻŧ.
āĻĒā§āĻ°ā§‡āĻ°āĻŖ āĻ•āĻ°āĻž - āĻ¯āĻ–āĻ¨ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻŸāĻŋ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ (āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ­āĻ°āĻžāĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛, āĻ¨ā§€āĻšā§‡ āĻ†āĻ°āĻ“ āĻ•āĻŋāĻ›ā§)āĨ¤

āĻļā§‡āĻˇ āĻĻā§āĻŸāĻŋ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ° āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ¨āĻž.

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻ˛āĻŋāĻ–ā§āĻ¨:

āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻ•ā§‹āĻĄ

class NTPPacket:
    _FORMAT = "!B B b b 11I"

    def __init__(self, version_number=2, mode=3, transmit=0):
        # Necessary of enter leap second (2 bits)
        self.leap_indicator = 0
        # Version of protocol (3 bits)
        self.version_number = version_number
        # Mode of sender (3 bits)
        self.mode = mode
        # The level of "layering" reading time (1 byte)
        self.stratum = 0
        # Interval between requests (1 byte)
        self.pool = 0
        # Precision (log2) (1 byte)
        self.precision = 0
        # Interval for the clock reach NTP server (4 bytes)
        self.root_delay = 0
        # Scatter the clock NTP-server (4 bytes)
        self.root_dispersion = 0
        # Indicator of clocks (4 bytes)
        self.ref_id = 0
        # Last update time on server (8 bytes)
        self.reference = 0
        # Time of sending packet from local machine (8 bytes)
        self.originate = 0
        # Time of receipt on server (8 bytes)
        self.receive = 0
        # Time of sending answer from server (8 bytes)
        self.transmit = transmit

āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻžāĻ āĻžāĻ¤ā§‡ (āĻāĻŦāĻ‚ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°āĻ¤ā§‡), āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻāĻŸāĻŋāĻ•ā§‡ āĻŦāĻžāĻ‡āĻŸā§‡āĻ° āĻ…ā§āĻ¯āĻžāĻ°ā§‡āĻ¤ā§‡ āĻĒāĻ°āĻŋāĻŖāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤
āĻāĻ‡ (āĻāĻŦāĻ‚ āĻŦāĻŋāĻĒāĻ°ā§€āĻ¤) āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻ°āĻž āĻĻā§āĻŸāĻŋ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ˛āĻŋāĻ–āĻŦ - pack() āĻāĻŦāĻ‚ unpack():

āĻĒā§āĻ¯āĻžāĻ• āĻĢāĻžāĻ‚āĻļāĻ¨

def pack(self):
        return struct.pack(NTPPacket._FORMAT,
                (self.leap_indicator << 6) + 
                    (self.version_number << 3) + self.mode,
                self.stratum,
                self.pool,
                self.precision,
                int(self.root_delay) + get_fraction(self.root_delay, 16),
                int(self.root_dispersion) + 
                    get_fraction(self.root_dispersion, 16),
                self.ref_id,
                int(self.reference),
                get_fraction(self.reference, 32),
                int(self.originate),
                get_fraction(self.originate, 32),
                int(self.receive),
                get_fraction(self.receive, 32),
                int(self.transmit),
                get_fraction(self.transmit, 32))

āĻ†āĻ¨āĻĒā§āĻ¯āĻžāĻ• āĻĢāĻžāĻ‚āĻļāĻ¨

def unpack(self, data: bytes):
        unpacked_data = struct.unpack(NTPPacket._FORMAT, data)

        self.leap_indicator = unpacked_data[0] >> 6  # 2 bits
        self.version_number = unpacked_data[0] >> 3 & 0b111  # 3 bits
        self.mode = unpacked_data[0] & 0b111  # 3 bits

        self.stratum = unpacked_data[1]  # 1 byte
        self.pool = unpacked_data[2]  # 1 byte
        self.precision = unpacked_data[3]  # 1 byte

        # 2 bytes | 2 bytes
        self.root_delay = (unpacked_data[4] >> 16) +
            (unpacked_data[4] & 0xFFFF) / 2 ** 16
         # 2 bytes | 2 bytes
        self.root_dispersion = (unpacked_data[5] >> 16) +
            (unpacked_data[5] & 0xFFFF) / 2 ** 16 

        # 4 bytes
        self.ref_id = str((unpacked_data[6] >> 24) & 0xFF) + " " + 
                      str((unpacked_data[6] >> 16) & 0xFF) + " " +  
                      str((unpacked_data[6] >> 8) & 0xFF) + " " +  
                      str(unpacked_data[6] & 0xFF)

        self.reference = unpacked_data[7] + unpacked_data[8] / 2 ** 32  # 8 bytes
        self.originate = unpacked_data[9] + unpacked_data[10] / 2 ** 32  # 8 bytes
        self.receive = unpacked_data[11] + unpacked_data[12] / 2 ** 32  # 8 bytes
        self.transmit = unpacked_data[13] + unpacked_data[14] / 2 ** 32  # 8 bytes

        return self

āĻ…āĻ˛āĻ¸ āĻ˛ā§‹āĻ•ā§‡āĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ - āĻ•ā§‹āĻĄ āĻ¯āĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœāĻŸāĻŋāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻ¨ā§āĻĻāĻ° āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚āĻ¯āĻŧā§‡ āĻĒāĻ°āĻŋāĻŖāĻ¤ āĻ•āĻ°ā§‡

def to_display(self):
        return "Leap indicator: {0.leap_indicator}n" 
                "Version number: {0.version_number}n" 
                "Mode: {0.mode}n" 
                "Stratum: {0.stratum}n" 
                "Pool: {0.pool}n" 
                "Precision: {0.precision}n" 
                "Root delay: {0.root_delay}n" 
                "Root dispersion: {0.root_dispersion}n" 
                "Ref id: {0.ref_id}n" 
                "Reference: {0.reference}n" 
                "Originate: {0.originate}n" 
                "Receive: {0.receive}n" 
                "Transmit: {0.transmit}"
                .format(self)

āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻšā§āĻ›ā§‡

āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻ­āĻ°āĻž āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ° āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻžāĻ āĻžāĻ¨ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ, āĻŽā§‹āĻĄ и āĻĒā§āĻ°ā§‡āĻ°āĻŖ āĻ•āĻ°āĻžāĨ¤ āĻĻā§āĻ¯ āĻĒā§āĻ°ā§‡āĻ°āĻŖ āĻ•āĻ°āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻŽā§‡āĻļāĻŋāĻ¨ā§‡ āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻ¸āĻŽāĻ¯āĻŧ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ (āĻœāĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ°āĻŋ 1, 1900 āĻĨā§‡āĻ•ā§‡ āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž), āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ - 1-4, āĻŽā§‹āĻĄ - 3 (āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻŽā§‹āĻĄ)āĨ¤

āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°, āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ° āĻĒāĻ°ā§‡, NTP āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ° āĻĒā§‚āĻ°āĻŖ āĻ•āĻ°ā§‡, āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ…āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋ āĻ•āĻ°ā§‡ āĻ‰ā§ŽāĻĒāĻ¤ā§āĻ¤āĻŋ āĻĨā§‡āĻ•ā§‡ āĻŽāĻžāĻ¨ āĻĒā§āĻ°ā§‡āĻ°āĻŖ āĻ•āĻ°āĻž, āĻ¯āĻž āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻāĻ¸ā§‡āĻ›āĻŋāĻ˛. āĻ•ā§‡āĻ¨ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ¤āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧā§‡āĻ° āĻŽā§‚āĻ˛ā§āĻ¯ āĻĒā§‚āĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¨āĻž āĻāĻŸāĻž āĻ†āĻŽāĻžāĻ° āĻ•āĻžāĻ›ā§‡ āĻāĻ•āĻŸāĻŋ āĻ°āĻšāĻ¸ā§āĻ¯ āĻ‰ā§ŽāĻĒāĻ¤ā§āĻ¤āĻŋ. āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ¯āĻ–āĻ¨ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻŸāĻŋ āĻĢāĻŋāĻ°ā§‡ āĻ†āĻ¸ā§‡, āĻ¤āĻ–āĻ¨ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸā§‡āĻ° 4āĻŸāĻŋ āĻ¸āĻŽāĻ¯āĻŧā§‡āĻ° āĻŽāĻžāĻ¨ āĻĨāĻžāĻ•ā§‡ - āĻ…āĻ¨ā§āĻ°ā§‹āĻ§āĻŸāĻŋ āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻ¸āĻŽāĻ¯āĻŧ (āĻ‰ā§ŽāĻĒāĻ¤ā§āĻ¤āĻŋ), āĻ¯ā§‡ āĻ¸āĻŽāĻ¯āĻŧ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒā§‡āĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ (āĻ¨āĻŋāĻ¨), āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻ¸āĻŽāĻ¯āĻŧ (āĻĒā§āĻ°ā§‡āĻ°āĻŖ āĻ•āĻ°āĻž) āĻāĻŦāĻ‚ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻ¸āĻŽāĻ¯āĻŧ - āĻĒā§ŒāĻāĻ›āĻž (āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœā§‡ āĻ¨ā§‡āĻ‡)āĨ¤ āĻāĻ‡ āĻŽāĻžāĻ¨ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻ†āĻŽāĻ°āĻž āĻ¸āĻ āĻŋāĻ• āĻ¸āĻŽāĻ¯āĻŧ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋāĨ¤

āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻāĻŦāĻ‚ āĻ•ā§‹āĻĄ āĻ—ā§āĻ°āĻšāĻŖ

# Time difference between 1970 and 1900, seconds
FORMAT_DIFF = (datetime.date(1970, 1, 1) - datetime.date(1900, 1, 1)).days * 24 * 3600
# Waiting time for recv (seconds)
WAITING_TIME = 5
server = "pool.ntp.org"
port = 123
    
packet = NTPPacket(version_number=2, mode=3, transmit=time.time() + FORMAT_DIFF)
answer = NTPPacket()
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
    s.settimeout(WAITING_TIME)
    s.sendto(packet.pack(), (server, port))
    data = s.recv(48)
    arrive_time = time.time() + FORMAT_DIFF
    answer.unpack(data)

āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻĄā§‡āĻŸāĻž āĻĒā§āĻ°āĻ¸ā§‡āĻ¸āĻŋāĻ‚

āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻĄā§‡āĻŸāĻž āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖāĻŸāĻŋ āĻ°ā§‡āĻŽāĻ¨ā§āĻĄ āĻāĻŽ. āĻ¸ā§āĻŽāĻ˛āĻŋāĻ¯āĻŧāĻžāĻ¨ (1978) āĻāĻ° āĻĒā§āĻ°āĻžāĻ¨ā§‹ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻĨā§‡āĻ•ā§‡ āĻ‡āĻ‚āĻ°ā§‡āĻœ āĻ­āĻĻā§āĻ°āĻ˛ā§‹āĻ•ā§‡āĻ° āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ˛āĻžāĻĒā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ: “āĻāĻ• āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ° āĻšāĻžāĻ¤ā§‡ āĻ˜āĻĄāĻŧāĻŋ āĻ›āĻŋāĻ˛ āĻ¨āĻž, āĻ¤āĻŦā§‡ āĻŦāĻžāĻĄāĻŧāĻŋāĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ āĻŋāĻ• āĻĒā§āĻ°āĻžāĻšā§€āĻ° āĻ˜āĻĄāĻŧāĻŋ āĻ›āĻŋāĻ˛, āĻ¯āĻž āĻ¤āĻŋāĻ¨āĻŋ āĻŽāĻžāĻā§‡ āĻŽāĻžāĻā§‡ āĻŦāĻžāĻ¤āĻžāĻ¸ āĻ•āĻ°āĻ¤ā§‡ āĻ­ā§āĻ˛ā§‡ āĻ¯āĻžāĻ‡āĨ¤ āĻāĻ•āĻĻāĻŋāĻ¨, āĻ†āĻŦāĻžāĻ° āĻ˜āĻĄāĻŧāĻŋ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻ¤ā§‡ āĻ­ā§āĻ˛ā§‡ āĻ—āĻŋāĻ¯āĻŧā§‡, āĻ¸ā§‡ āĻ¤āĻžāĻ° āĻŦāĻ¨ā§āĻ§ā§āĻ° āĻ¸āĻžāĻĨā§‡ āĻĻā§‡āĻ–āĻž āĻ•āĻ°āĻ¤ā§‡ āĻ—āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛, āĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ¨ā§āĻ§ā§āĻ¯āĻž āĻ•āĻžāĻŸāĻŋāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛, āĻāĻŦāĻ‚ āĻ¯āĻ–āĻ¨ āĻ¸ā§‡ āĻŦāĻžāĻĄāĻŧāĻŋ āĻĢāĻŋāĻ°ā§‡āĻ›āĻŋāĻ˛, āĻ¸ā§‡ āĻ˜āĻĄāĻŧāĻŋāĻŸāĻŋ āĻ¸āĻ āĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻĒā§‡āĻ°ā§‡āĻ›āĻŋāĻ˛āĨ¤ āĻ­ā§āĻ°āĻŽāĻŖā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ†āĻ—ā§‡ āĻĨā§‡āĻ•ā§‡ āĻœāĻžāĻ¨āĻž āĻ¨āĻž āĻĨāĻžāĻ•āĻ˛ā§‡ āĻ¤āĻŋāĻ¨āĻŋ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻāĻŸāĻŋ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°ā§‡āĻ›āĻŋāĻ˛ā§‡āĻ¨? āĻ‰āĻ¤ā§āĻ¤āĻ°āĻŸāĻŋ āĻšāĻ˛: "āĻ˜āĻ° āĻ›ā§‡āĻĄāĻŧā§‡, āĻāĻ•āĻœāĻ¨ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋ āĻ˜āĻĄāĻŧāĻŋāĻ° āĻ•āĻžāĻāĻŸāĻž āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻšāĻžāĻ¤ā§‡āĻ° āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¨ āĻŽāĻ¨ā§‡ āĻ°āĻžāĻ–ā§‡āĨ¤ āĻŦāĻ¨ā§āĻ§ā§āĻ° āĻ•āĻžāĻ›ā§‡ āĻ†āĻ¸āĻž āĻāĻŦāĻ‚ āĻ…āĻ¤āĻŋāĻĨāĻŋāĻĻā§‡āĻ° āĻŦāĻŋāĻĻāĻžāĻ¯āĻŧā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¤āĻŋāĻ¨āĻŋ āĻ¤āĻžāĻ° āĻ†āĻ—āĻŽāĻ¨ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ¸ā§āĻĨāĻžāĻ¨ā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¨ā§‹āĻŸ āĻ•āĻ°ā§‡āĻ¨āĨ¤ āĻāĻŸāĻŋ āĻ¤āĻžāĻ•ā§‡ āĻ–ā§āĻāĻœā§‡ āĻŦā§‡āĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ āĻ¯ā§‡ āĻ¸ā§‡ āĻ•āĻ¤āĻ•ā§āĻˇāĻŖ āĻĻā§‚āĻ°ā§‡ āĻ›āĻŋāĻ˛āĨ¤ āĻŦāĻžāĻĄāĻŧāĻŋāĻ¤ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻāĻŦāĻ‚ āĻ˜āĻĄāĻŧāĻŋāĻ° āĻĻāĻŋāĻ•ā§‡ āĻ¤āĻžāĻ•āĻŋāĻ¯āĻŧā§‡ āĻāĻ•āĻœāĻ¨ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋ āĻ¤āĻžāĻ° āĻ…āĻ¨ā§āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ° āĻ¸āĻŽāĻ¯āĻŧāĻ•āĻžāĻ˛ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°ā§‡āĨ¤ āĻāĻ‡ āĻ¸āĻŽāĻ¯āĻŧ āĻĨā§‡āĻ•ā§‡ āĻŦāĻŋāĻ¯āĻŧā§‹āĻ— āĻ•āĻ°ā§‡ āĻ¤āĻŋāĻ¨āĻŋ āĻ¯ā§‡ āĻ¸āĻŽāĻ¯āĻŧāĻŸāĻž āĻĻā§‡āĻ–āĻ¤ā§‡ āĻ—āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ā§‡āĻ¨, āĻ¸ā§‡āĻ‡ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋ āĻ¸ā§‡āĻ–āĻžāĻ¨ā§‡ āĻāĻŦāĻ‚ āĻĒāĻŋāĻ›āĻ¨ā§‡āĻ° āĻ°āĻžāĻ¸ā§āĻ¤āĻžāĻ¯āĻŧ āĻ•āĻžāĻŸāĻžāĻ¨ā§‹ āĻ¸āĻŽāĻ¯āĻŧ āĻ–ā§āĻāĻœā§‡ āĻŦā§‡āĻ° āĻ•āĻ°ā§‡āĨ¤ āĻ…āĻ¤āĻŋāĻĨāĻŋāĻĻā§‡āĻ° āĻŦāĻŋāĻĻāĻžāĻ¯āĻŧā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ°āĻžāĻ¸ā§āĻ¤āĻžāĻ¯āĻŧ āĻŦā§āĻ¯āĻ¯āĻŧ āĻ•āĻ°āĻž āĻ…āĻ°ā§āĻ§ā§‡āĻ• āĻ¸āĻŽāĻ¯āĻŧ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡ āĻ¤āĻŋāĻ¨āĻŋ āĻŦāĻžāĻĄāĻŧāĻŋāĻ¤ā§‡ āĻ†āĻ¸āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ–ā§āĻāĻœā§‡ āĻŦā§‡āĻ° āĻ•āĻ°āĻžāĻ° āĻāĻŦāĻ‚ āĻ¸ā§‡āĻ‡ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§€ āĻ¤āĻžāĻ° āĻ˜āĻĄāĻŧāĻŋāĻ° āĻšāĻžāĻ¤ āĻ¸āĻžāĻŽāĻžā§āĻœāĻ¸ā§āĻ¯ āĻ•āĻ°āĻžāĻ° āĻ¸ā§āĻ¯ā§‹āĻ— āĻĒāĻžāĻ¨āĨ¤

āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ–ā§āĻāĻœā§āĻ¨:

  1. āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻĨā§‡āĻ•ā§‡ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ­ā§āĻ°āĻŽāĻŖā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ–ā§‹āĻāĻœāĻž: ((āĻ†āĻ—āĻŽāĻ¨ - āĻ‰ā§ŽāĻĒāĻ¤ā§āĻ¤āĻŋ) - (āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻŸ - āĻ°āĻŋāĻ¸āĻŋāĻ­)) / 2
  2. āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻāĻŦāĻ‚ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āĻ¯ āĻ–ā§āĻāĻœā§āĻ¨:
    āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋ - āĻ‰ā§ŽāĻĒāĻ¤ā§āĻ¤āĻŋ - ((āĻ†āĻ—āĻŽāĻ¨ - āĻ‰ā§ŽāĻĒāĻ¤ā§āĻ¤āĻŋ) - (āĻĒāĻ°āĻŋāĻŦāĻšāĻ¨ - āĻ—ā§āĻ°āĻšāĻŖ)) / 2 =
    2 * āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋ - 2 * āĻ‰ā§ŽāĻĒāĻ¤ā§āĻ¤āĻŋ - āĻ†āĻ—āĻŽāĻ¨ + āĻ‰ā§ŽāĻĒāĻ¤ā§āĻ¤āĻŋ + āĻĒā§āĻ°ā§‡āĻ°āĻŖ - āĻ—ā§āĻ°āĻšāĻŖ =
    āĻ—ā§āĻ°āĻšāĻŖ - āĻ‰ā§ŽāĻĒāĻ¤ā§āĻ¤āĻŋ - āĻ†āĻ—āĻŽāĻ¨ + āĻĒā§āĻ°ā§‡āĻ°āĻŖ

āĻ†āĻŽāĻ°āĻž āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻ¸āĻŽāĻ¯āĻŧā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻŽāĻžāĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻœā§€āĻŦāĻ¨ āĻ‰āĻĒāĻ­ā§‹āĻ— āĻ•āĻ°āĻŋāĨ¤

āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ

time_different = answer.get_time_different(arrive_time)
result = "Time difference: {}nServer time: {}n{}".format(
    time_different,
    datetime.datetime.fromtimestamp(time.time() + time_different).strftime("%c"),
    answer.to_display())
print(result)

āĻĻāĻ°āĻ•āĻžāĻ°ā§€ āĻ˛āĻŋāĻ‚āĻ•.

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨