Maison  >  Article  >  interface Web  >  L'explication la plus détaillée de Date en JavaScript

L'explication la plus détaillée de Date en JavaScript

黄舟
黄舟original
2017-03-07 15:01:08973parcourir

Je ne parlerai pas des bases Date()~ : )

Comment obtenir le nombre de jours dans un certain mois ?

Je me demande si quelqu'un a rencontré ce problème ? Je pense que si vous avez écrit un composant de date, vous devez avoir ce problème. Ma solution à l'époque était la suivante :

Dans les trois méthodes suivantes, j'ai utilisé 0 comme paramètre de mois en fonction de la définition du mois de. Date en JS lui-même. Janvier

La manière la plus honnête

const EVERY_MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

function getDays(year, month) {
  if (month === 1 && isLeap(year)) return 29;
  return EVERY_MONTH_DAYS[month];
}

est de cartographier manuellement les jours de chaque mois. Février est une année bissextile, Nombre de jours 1

Utilisez simplement un plug-in de calendrier pour osx que vous avez écrit vous-même http://www.php.cn/

N'existe-t-il pas une meilleure façon ? Ce serait bien s'il n'y avait pas de logique pour la cartographie manuelle et le jugement des années bissextiles.

Une approche légèrement diao

function getDays(year, month) {
  if (month === 1) return new Date(year, month, 29).getMonth() === 1 ? 29 : 28;
  return new Date(year, month, 31).getMonth() === month ? 31 : 30;
}

Nous avons constaté que le troisième paramètre de new Date() peut être plus grand que ce que nous connaissons Le dernier jour de chaque mois, par exemple :

new Date(2016, 0, 200) //Mon Jul 18 2016 00:00:00 GMT+0800 (CST)

De cette façon, nous utiliserons les caractéristiques de ce JS et utiliserons les deux touches 29 et 31 Click , pour juger si c'est le dernier jour de ce mois sauf 1 ou ce mois-là ? (En fait, 28 et 30 sont les points clés).

Une méthode légèrement plus diao

function getDays(year, month) {
  return new Date(year, month + 1, 0).getDate();
}

Que se passe-t-il si le troisième paramètre de new Date() reçoit une valeur inférieure à 1. ? , par exemple, si on passe 0, on obtiendra le dernier jour du mois dernier. Bien sûr, il n'y a pas de problème si on passe des nombres négatifs :

new Date(2016, 0, -200) //Sun Jun 14 2015 00:00:00 GMT+0800 (CST)

<.>

Date.prototype. Divers String

L'explication spécifique du document est trop paresseuse pour être copiée pour que tout le monde puisse la voir. Lien de référence : https://developer.mozilla.org/en-US/docs/. Web/JavaScript/Reference/Global_Objects/Date

Voici principalement pour vulgariser les connaissances suivantes auprès de tous :

GMT (Greenwich Mean Time)

Greenwich Mean Time (aussi connu comme Greenwich Mean Time ou Greenwich Mean Time, l'ancienne traduction est Greenwich Mean Time ; l'anglais Greenwich Mean Time (GMT) fait référence à l'heure standard de l'Observatoire royal de Greenwich dans la banlieue de Londres, en Angleterre, car le méridien d'origine est défini sur le longitude y passant.

Depuis le 5 février 1924, l'Observatoire de Greenwich distribue toutes les heures au monde des informations sur le réglage de l'heure.

Théoriquement, midi dans le temps moyen de Greenwich fait référence au moment où le soleil traverse le méridien de Greenwich (c'est-à-dire lorsqu'il est à son point le plus élevé au-dessus de Greenwich). En raison du mouvement irrégulier de la Terre sur son orbite elliptique, cette heure peut différer de l’heure solaire réelle, avec une erreur maximale pouvant atteindre 16 minutes.

La rotation quotidienne de la Terre étant quelque peu irrégulière et ralentissant lentement, l'heure moyenne de Greenwich n'est plus utilisée comme heure standard. L’heure standard actuelle est le temps universel coordonné (UTC), qui est rapporté par les horloges atomiques.

Nous voyons donc également dans la documentation sur MDN que l'explication de

est : toGMTString()

Renvoie une chaîne représentant la date basée sur le fuseau horaire GMT (UT). toUTCString() à la place.

UTC (Heure standard universelle)

Temps universel coordonné, également connu sous le nom de Temps standard universel ou Temps universel coordonné, appelé UTC (de l'anglais "Cooperative Temps Universel" / Du français "Temps Universel Cordonné"), c'est l'étalon horaire mondial le plus important. Il est basé sur le temps atomique et la seconde, et est aussi proche que possible du temps moyen de Greenwich

CST (Heure de Pékin)

Heure de Pékin, heure standard de Chine, heure standard de Chine. En termes de division de fuseaux horaires, il appartient au huitième district de l'Est, qui a 8 heures d'avance sur le temps universel coordonné et est enregistré sous la forme UTC 8.

Cependant, ce qui prête à confusion avec l'abréviation CST, c'est qu'elle peut représenter quatre heures différentes en même temps :

  • Central Standard Time (USA) UT-6 : 00

  • Heure standard du Centre (Australie) UT 9h30

  • Heure standard de Chine UT 8h00

  • Cuba Standard Time UT-4:00

Insérer un problème selon lequel l'heure du client JS et l'heure du serveur en Chine sont incohérentes

Le résumé est que le les extrémités avant et arrière transmettent l'heure. Lorsque cela est possible, essayez d'utiliser l'heure UTC.

Méthode de représentation de la date et de l'heure ISO

if ( !Date.prototype.toISOString ) {
  ( function() {

    function pad(number) {
      if ( number < 10 ) {
        return &#39;0&#39; + number;
      }
      return number;
    }

    Date.prototype.toISOString = function() {
      return this.getUTCFullYear() +
        &#39;-&#39; + pad( this.getUTCMonth() + 1 ) +
        &#39;-&#39; + pad( this.getUTCDate() ) +
        &#39;T&#39; + pad( this.getUTCHours() ) +
        &#39;:&#39; + pad( this.getUTCMinutes() ) +
        &#39;:&#39; + pad( this.getUTCSeconds() ) +
        &#39;.&#39; + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) +
        &#39;Z&#39;;
    };

  }() );
}

Grâce à Polyfill, nous pouvons savoir comment ISO représente le temps, la chose la plus importante La caractéristique est que le dernier chiffre est "Z", et qu'il représente toujours l'heure UTC.

Ajouts supplémentaires

.valueOf() et .getTime()

ont les mêmes fonctions que .valueOf(). .getTime()

Cette méthode est généralement appelée depuis JavaScript plutôt qu'explicitement dans le code. Quelle est la signification ? Sans

, les instances de valueOf ne peuvent pas effectuer d'opérations. Date

var obj = Object.create(null);
obj + 1; // Uncaught TypeError: Cannot convert object to primitive value(…)

.toJSON

Quand j'ai regardé directement le nom de cette API, j'ai pensé qu'elle renverrait une chaîne au format JSON, mais en fait, c'est une telle chose

new Date().toJSON() // "2016-05-05T06:03:28.130Z"

En fait, c'est une telle chose

JSON.stringify(new Date()) // ""2016-05-05T06:06:02.615Z""

Le résultat peut-il être analysé ?

JSON.parse(JSON.stringify(new Date())) // "2016-05-05T06:19:24.766Z"
JSON.parse(&#39;"&#39; + new Date().toJSON() + &#39;"&#39;) // "2016-05-05T06:19:24.766Z"

Mais le résultat n'est qu'une chaîne. Vous devez remettre cette chaîne à

. new Date()

.toLocaleFormat()

n'appartient à aucun standard. Implémenté en JavaScript 1.6. Il semble que seul Firefox prenne en charge cette API. En fait, la bonne approche consiste à utiliser

.toLocaleDateString()

.toLocale et divers String()

.toLcale各种String(locales [, options]]).

妈的这个 API 有点烦,看 MDN 的文档你就知道。这个 API 是用来本地化时间的。

这里稍微说下我对这些参数的理解:

locales

var date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));

// formats below assume the local time zone of the locale;
// America/Los_Angeles for the US

// US English uses month-day-year order
alert(date.toLocaleString("en-US"));
// → "12/19/2012, 7:00:00 PM"

// British English uses day-month-year order
alert(date.toLocaleString("en-GB"));
// → "20/12/2012 03:00:00"

// Korean uses year-month-day order
alert(date.toLocaleString("ko-KR"));
// → "2012. 12. 20. 오후 12:00:00"

// Arabic in most Arabic speaking countries uses real Arabic digits
alert(date.toLocaleString("ar-EG"));
// → "٢٠‏/١٢‏/٢٠١٢ ٥:٠٠:٠٠ ص"

// for Japanese, applications may want to use the Japanese calendar,
// where 2012 was the year 24 of the Heisei era
alert(date.toLocaleString("ja-JP-u-ca-japanese"));
// → "24/12/20 12:00:00"

// when requesting a language that may not be supported, such as
// Balinese, include a fallback language, in this case Indonesian
alert(date.toLocaleString(["ban", "id"]));
// → "20/12/2012 11.00.00"

locales所指的地区的时区和语言输出。

options

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString

  • localeMatcher 选择本地匹配的什么算法,似乎没什么大用

  • timeZone 再设置下 UTC 时区

  • hour12 是否12小时制

  • formatMatcher 各日期时间单元的格式化

    • weekday Possible values are "narrow", "short", "long".

    • era Possible values are "narrow", "short", "long".

    • year Possible values are "numeric", "2-digit".

    • month Possible values are "numeric", "2-digit", "narrow", "short", "long".

    • day Possible values are "numeric", "2-digit".

    • hour Possible values are "numeric", "2-digit".

    • minute Possible values are "numeric", "2-digit".

    • second Possible values are "numeric", "2-digit".

    • timeZoneName Possible values are "short", "long".

栗子:

var date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));

date.toLocaleString("en-US", {hour12: false}); // "12/19/2012, 19:00:00"

var options = {timeZoneName:&#39;long&#39;,weekday: "long", year: "2-digit", month: "narrow", day: "numeric"};
date.toLocaleString("en-US", options); // "Thursday, D 20, 12, China Standard Time"

插一个JavaScript 显示 Y-m-d H:i:s 的日期时间格式

老实的方法

let date = new Date();
let result = [
  [
    date.getFullYear(),
    date.getMonth() + 1,
    date.getDate()
  ].join(&#39;-&#39;),
  [
    date.getHours(),
    date.getMinutes(),
    date.getSeconds()
  ].join(&#39;:&#39;)
].join(&#39; &#39;).replace(/\b\d\b/g, &#39;0$&&#39;);

diao 一点的方法

var date = new Date();
var result = date.toLocaleString(&#39;zh-CN&#39;, { hour12: false })
  .replace(/\//g, &#39;-&#39;).replace(/\b\d\b/g, &#39;0$&&#39;);

一些有用的时间库

  • https://github.com/moment/moment

  • https://github.com/rmm5t/jquery-timeago

 以上就是关于JavaScript 的 Date 最详细解读的内容,更多相关内容请关注PHP中文网(www.php.cn)!



Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn