জেএসএন স্ট্রিংফাই ইউটিসির কারণে তারিখের সময় পরিবর্তন করে


99

জাভাস্ক্রিপ্টে আমার তারিখের অবজেক্টগুলি সর্বদা ইউটিসি +২ দ্বারা প্রতিনিধিত্ব করা হয় কারণ আমি যেখানে রয়েছি। সুতরাং এই মত

Mon Sep 28 10:00:00 UTC+0200 2009

সমস্যা JSON.stringifyউপরের তারিখকে রূপান্তর করছে

2009-09-28T08:00:00Z  (notice 2 hours missing i.e. 8 instead of 10)

আমার যা প্রয়োজন তারিখ এবং সময় সম্মানিত করার জন্য তবে এটি নয়, তাই এটি হওয়া উচিত

2009-09-28T10:00:00Z  (this is how it should be)

মূলত আমি এটি ব্যবহার:

var jsonData = JSON.stringify(jsonObject);

আমি একটি replacer পরামিতি (স্ট্রিংফাই উপর দ্বিতীয় প্যারামিটার) পাস করার চেষ্টা করেছি কিন্তু সমস্যাটি হ'ল মানটি ইতিমধ্যে প্রক্রিয়াভুক্ত হয়েছে।

আমিও ব্যবহার করার চেষ্টা toString()এবং toUTCString()তারিখ বস্তুর উপর, কিন্তু এই আমাকে দিতে না আমি হয় চান ..

আমাকে কি কেউ সাহায্য করতে পারবেন?


17
2009-09-28T10:00:00Z সময় হিসাবে একই মুহূর্ত প্রতিনিধিত্ব করে নাMon Sep 28 10:00:00 UTC+0200 2009Zএকটি ইন আইএসও 8601 তারিখ ইউটিসি মানে, এবং ইউটিসি 10 বাজে সময় একটি ভিন্ন মুহূর্তে +0200 10 ঘটিকায় করতে। সঠিক সময় অঞ্চলটি দিয়ে তারিখটি সিরিয়ালীকৃত করা চাওয়া এক জিনিস হতে পারে তবে আপনি আমাদেরকে এটি এমন একটি উপস্থাপনায় ক্রমিকায়িত করতে সহায়তা করতে বলছেন যা স্পষ্টতই, উদ্দেশ্যমূলকভাবে ভুল
মার্ক অ্যামেরি

4
মার্কস মন্তব্যে যোগ করার জন্য, বেশিরভাগ ক্ষেত্রে আপনার
তারিখের সময়গুলি

উত্তর:


69

সম্প্রতি আমি একই ইস্যুতে চালিয়েছি। এবং নিম্নলিখিত কোড ব্যবহার করে এটি সমাধান করা হয়েছিল:

x = new Date();
let hoursDiff = x.getHours() - x.getTimezoneOffset() / 60;
let minutesDiff = (x.getHours() - x.getTimezoneOffset()) % 60;
x.setHours(hoursDiff);
x.setMinutes(minutesDiff);

হ্যাঁ তবে এটি যদি ওয়েবসাইটটি আমার দেশের অভ্যন্তরে ব্যবহার করা হয়, যদি এটি আমেরিকার মতো অন্য দেশে ব্যবহার করা হয় - এটি 2 হবে না ...
স্মিথকে

স্পষ্টতই, এই মানটি গণনা করা উচিত।
আনাতোলি

4
ধন্যবাদ ... আমি আসলে এখানে একটি দুর্দান্ত লাইব্রেরি পেয়েছি, ব্লগ.স্টেভলেভিথান / আরচাইভস / তারিখ- সময়- ফর্ম্যাট আপনাকে যা করতে হবে তা (সম্ভবত এটি আপনাকে সহায়তা করবে), আপনি মিথ্যা পাস করেছেন এবং এটি রূপান্তরিত হবে না। var কি = ডেটফর্ম্যাট (myStartDate, "isoDateTime", মিথ্যা);
স্মিথকে

12
এটি আপনার কোডটি নন-টাইমজোনকে নিরাপদ করার কারণে এটি ভুল
rect

5
এই উত্তরটি ভুল। ওপি বুঝতে পারে না যে "2009-09-28T08: 00: 00Z" এবং "সোমবার 28 সেপ্টেম্বর 10:00:00 ইউটিসি + 0200 2009" ঠিক একই মুহুর্ত এবং টাইমজোন অফসেটের সামঞ্জস্য করা আসলে তৈরি করছে ভুল সময়।
রবজি

41

জেএসওএন সেই Date.prototype.toISOStringফাংশনটি ব্যবহার করে যা স্থানীয় সময়কে উপস্থাপন করে না - এটি অযাচিত ইউটিসিতে সময়কে উপস্থাপন করে - আপনি যদি আপনার তারিখের আউটপুটটি দেখে থাকেন তবে আপনি দেখতে পাবেন যে আপনি ইউটিসি + ২ ঘন্টা রয়েছেন, এ কারণেই জেএসএন স্ট্রিংটি দুই ঘন্টা পরিবর্তিত হয়ে যায়, তবে এটি যদি একই সময়টিকে একাধিক সময় অঞ্চল জুড়ে সঠিকভাবে উপস্থাপন করতে দেয়।


4
কখনও এই সম্পর্কে ভাবেন নি, তবে আপনি ঠিক বলেছেন। এটিই সমাধান: আমি প্রোটোটাইপ ব্যবহার করে আমার পছন্দ মতো যে কোনও বিন্যাস নির্দিষ্ট করতে পারি।
racs


10

এখানে আরও একটি উত্তর দেওয়া হয়েছে (এবং ব্যক্তিগতভাবে আমি মনে করি এটি আরও উপযুক্ত)

var currentDate = new Date(); 
currentDate = JSON.stringify(currentDate);

// Now currentDate is in a different format... oh gosh what do we do...

currentDate = new Date(JSON.parse(currentDate));

// Now currentDate is back to its original form :)

@ রোহান এটি নির্দেশ করার জন্য ধন্যবাদ তবে প্রশ্নের ট্যাগগুলিতে জাভাস্ক্রিপ্ট উল্লেখ রয়েছে।
আগস্ট

7

ডেট.টোজসন () ইউটিসি-তারিখটিকে স্ট্রিং ফর্ম্যাট করে মুদ্রণ করে (সুতরাং এটি জেএসএন ফর্ম্যাটে রূপান্তরিত করার সাথে এটি অফসেট যুক্ত করে)।

date = new Date();
new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toJSON();

6
সাধারণত আপনার কোডটি কী করে তার একটি ব্যাখ্যা যুক্ত করা ভাল ধারণা। এটি নতুন বিকাশকারীদের কোডটি কীভাবে কাজ করে তা বুঝতে সহায়তা করে।
কালেব ক্লেভেটার

উত্তরে কোডটি কেন কাজ করা উচিত তা আপনি ব্যাখ্যা করতে পারেন?
ক্রিশ্তিক

এটি আমার পক্ষেও কার্যকর, তবে আপনি কীভাবে এটি ব্যাখ্যা করতে পারেন?
দেবেন পাতিল

আমি এই কোডের দ্বিতীয় লাইনটি ব্যাখ্যা করার চেষ্টা করব .. date.getTime()মিলি সেকেন্ডে সময় দেয়, তাই আমাদের দ্বিতীয় অপারেন্ডটিও মিলি সেকেন্ডে রূপান্তর করা উচিত। যেহেতু date.getTimezoneOffset()রিটার্নগুলি মিনিটের মধ্যে অফসেট হয়, আমরা এটি 60000 গুণ করি কারণ 1 মিনিট = 60000 মিলিসেকেন্ড। সুতরাং বর্তমান সময় থেকে অফসেট বিয়োগ করে আমরা ইউটিসিতে সময় পাই।
মাকসিম পাভলভ

4

আপনি স্থানীয় সময়ের সাথে ফর্ম্যাট করতে moment.js ব্যবহার করতে পারেন :

Date.prototype.toISOString = function () {
    return moment(this).format("YYYY-MM-DDTHH:mm:ss");
};

সাধারণ শ্রেণীর তারিখ ওভাররাইট করবেন না। কিছু বাহ্যিক মডিউল ব্যবহার করা হলে এটি সহজেই আপনার অ্যাপ্লিকেশনটি ভেঙে ফেলতে পারে।
ভাইচেস্লাভ ডব্রোমিস্লভ

3

আমি কিছুটা দেরি করেছি তবে আপনি প্রোটোটাইপ ব্যবহার করে কোনও তারিখের ক্ষেত্রে সর্বদা টস জসন ফাংশনটি ওভাররাইট করতে পারেন:

Date.prototype.toJSON = function(){
    return Util.getDateTimeString(this);
};

আমার ক্ষেত্রে, ইউটি.এল.ডেটটাইম স্ট্রিং (এটি) এর মতো একটি স্ট্রিং ফেরত দেয়: "2017-01-19T00: 00: 00Z"


4
নোট করুন যে ওভাররাইটিং ব্রাউজার গ্লোবালগুলি আপনার এম্বেড থাকা তৃতীয় পক্ষের লাইব্রেরিগুলি ভেঙে ফেলতে পারে এবং এটি একটি বড় অ্যান্টি-প্যাটার্ন। উত্পাদনে এটি কখনও করবেন না।
jakub.g

3

JSON.stringifyটাইম অঞ্চলগুলিকে উপেক্ষা করার জন্য বাইরের বাইরে সমাধান :

  • খাঁটি জাভাস্ক্রিপ্ট (আনাতোলির উত্তরের ভিত্তিতে):

// Before: JSON.stringify apply timezone offset
const date =  new Date();
let string = JSON.stringify(date);
console.log(string);

// After: JSON.stringify keeps date as-is!
Date.prototype.toJSON = function(){
    const hoursDiff = this.getHours() - this.getTimezoneOffset() / 60;
    this.setHours(hoursDiff);
    return this.toISOString();
};
string = JSON.stringify(date);
console.log(string);

মুহূর্ত + মুহুর্ত-সময় অঞ্চল লাইব্রেরি ব্যবহার করে:

const date =  new Date();
let string = JSON.stringify(date);
console.log(string);

Date.prototype.toJSON = function(){
    return moment(this).format("YYYY-MM-DDTHH:mm:ss:ms");;
};
string = JSON.stringify(date);
console.log(string);
<html>
  <header>
    <script src="https://momentjs.com/downloads/moment.min.js"></script>
    <script src="https://momentjs.com/downloads/moment-timezone-with-data-10-year-range.min.js"></script>
</header>
</html>


2

সাধারণত আপনি নিজের ব্যবহারকারীদের কাছে তার স্থানীয় সময়ে তারিখগুলি উপস্থাপন করতে চান-

এজন্য আমরা জিএমটি (ইউটিসি) ব্যবহার করি।

স্থানীয় সময় স্ট্রিং পেতে ডেট.পার্স (জসনডেস্ট্রিং) ব্যবহার করুন,

আপনি যদি না চান প্রতিটি স্থানীয় দর্শকের কাছে আপনার স্থানীয় সময় প্রদর্শিত হয়।

সেক্ষেত্রে আনাতোলির পদ্ধতিটি ব্যবহার করুন।


2

moment.jsলাইব্রেরি (নন-টাইমজোন সংস্করণ) ব্যবহার করে এই সমস্যাটি ঘিরে ।

var newMinDate = moment(datePicker.selectedDates[0]);
var newMaxDate = moment(datePicker.selectedDates[1]);

// Define the data to ask the server for
var dataToGet = {"ArduinoDeviceIdentifier":"Temperatures",
                "StartDate":newMinDate.format('YYYY-MM-DD HH:mm'),
                "EndDate":newMaxDate.format('YYYY-MM-DD HH:mm')
};

alert(JSON.stringify(dataToGet));

আমি flatpickr.min.jsগ্রন্থাগারটি ব্যবহার করছিলাম । তৈরি হওয়া JSON অবজেক্টের সময় স্থানীয় প্রদত্ত সময়ের সাথে মেলে তবে তারিখ চয়নকারী er


2

আমি লিগ্যাসি স্টাফ নিয়ে কিছুটা কাজ করে চলেছি যেখানে তারা কেবল পূর্ব উপকূলের মার্কিন যুক্তরাষ্ট্রে কাজ করে এবং ইউটিসিতে তারিখগুলি সংরক্ষণ করে না, এটি সমস্ত EST। আমি ব্রাউজারে ব্যবহারকারী ইনপুট উপর ভিত্তি করে তারিখগুলি ফিল্টার করতে হয় তাই JSON ফর্ম্যাটে স্থানীয় সময় তারিখটি পাস করতে হবে।

ইতিমধ্যে পোস্ট করা এই সমাধানটি বিশদ করার জন্য - এটি আমি ব্যবহার করি:

// Could be picked by user in date picker - local JS date
date = new Date();

// Create new Date from milliseconds of user input date (date.getTime() returns milliseconds)
// Subtract milliseconds that will be offset by toJSON before calling it
new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toJSON();

সুতরাং আমার বোধগম্যটি এটি এগিয়ে যাবে এবং টাইমজোন অফসেট (রিটার্ন মিনিট) এর উপর ভিত্তি করে প্রারম্ভিক তারিখ থেকে সময় (মিলিসেকেন্ডে (সুতরাং 60000) বিয়োগ করবে - সময় সংযোজনের প্রত্যাশায় জেএসএন () যোগ করতে চলেছে।


2

জাভাস্ক্রিপ্ট সাধারণত স্থানীয় সময় অঞ্চলকে ইউটিসিতে রূপান্তর করে।

date = new Date();
date.setMinutes(date.getMinutes()-date.getTimezoneOffset())
JSON.stringify(date)

1

এখানে সত্যিই ঝরঝরে এবং সাধারণ কিছু রয়েছে (কমপক্ষে আমি এটি বিশ্বাস করি :)) এবং ব্রাউজারের নেটিভ ফাংশনগুলিকে ক্লোন করা বা ওভারলোড করার জন্য তারিখের কোনও হেরফেরের প্রয়োজন নেই যেমন জেএসওএন (রেফারেন্স: জেএসওএন কীভাবে জাভাস্ক্রিপ্টের তারিখ গঠন করে এবং টাইমজোন সংরক্ষণ করে , আদালত শাওসন)

JSON.stringify এ একটি প্রতিস্থাপনকারী ফাংশনটি পাস করুন যা আপনার হৃদয়ের সামগ্রীতে স্ট্রিমকে শক্তিশালী করে !!! এইভাবে আপনাকে ঘন্টা এবং মিনিটের তফাত বা অন্য কোনও হেরফের করতে হবে না।

আমি মধ্যবর্তী ফলাফলগুলি দেখতে কনসোল.লগগুলিতে রেখেছি যাতে এটি কী চলছে এবং পুনরাবৃত্তি কীভাবে কাজ করছে তা পরিষ্কার। এটি নোটিশের যোগ্য কিছু প্রকাশ করে: মান পরম থেকে পুনঃস্থাপনকারী ইতিমধ্যে আইএসও তারিখের ফর্ম্যাটে রূপান্তরিত হয়েছে :)। মূল ডেটা নিয়ে কাজ করতে এই [কী] ব্যবহার করুন।

var replacer = function(key, value)
{
    var returnVal = value;
    if(this[key] instanceof Date)
    {
        console.log("replacer called with key - ", key, " value - ", value, this[key]); 

        returnVal = this[key].toString();

        /* Above line does not strictly speaking clone the date as in the cloned object 
         * it is a string in same format as the original but not a Date object. I tried 
         * multiple things but was unable to cause a Date object being created in the 
         * clone. 
         * Please Heeeeelp someone here!

        returnVal = new Date(JSON.parse(JSON.stringify(this[key])));   //OR
        returnVal = new Date(this[key]);   //OR
        returnVal = this[key];   //careful, returning original obj so may have potential side effect

*/
    }
    console.log("returning value: ", returnVal);

    /* if undefined is returned, the key is not at all added to the new object(i.e. clone), 
     * so return null. null !== undefined but both are falsy and can be used as such*/
    return this[key] === undefined ? null : returnVal;
};

ab = {prop1: "p1", prop2: [1, "str2", {p1: "p1inner", p2: undefined, p3: null, p4date: new Date()}]};
var abstr = JSON.stringify(ab, replacer);
var abcloned = JSON.parse(abstr);
console.log("ab is: ", ab);
console.log("abcloned is: ", abcloned);

/* abcloned is:
 * {
  "prop1": "p1",
  "prop2": [
    1,
    "str2",
    {
      "p1": "p1inner",
      "p2": null,
      "p3": null,
      "p4date": "Tue Jun 11 2019 18:47:50 GMT+0530 (India Standard Time)"
    }
  ]
}
Note p4date is string not Date object but format and timezone are completely preserved.
*/

0

আপনার সার্ভারের ব্যাকএন্ড টাইমজোন-অজোনস্টিক কিনা তা সবই ফুটে যায়। যদি এটি না হয় তবে আপনাকে ধরে নিতে হবে যে সার্ভারের টাইমজোনটি ক্লায়েন্টের সমান, বা ক্লায়েন্টের টাইমজোন সম্পর্কিত তথ্য স্থানান্তর এবং এটি গণনায় অন্তর্ভুক্ত করে।

পোস্টগ্রিএসকিউএল ব্যাকএন্ড ভিত্তিক উদাহরণ:

select '2009-09-28T08:00:00Z'::timestamp -> '2009-09-28 08:00:00' (wrong for 10am)
select '2009-09-28T08:00:00Z'::timestamptz -> '2009-09-28 10:00:00+02'
select '2009-09-28T08:00:00Z'::timestamptz::timestamp -> '2009-09-28 10:00:00'

আপনি যদি টাইমজোন যুক্তি সঠিকভাবে প্রয়োগ করতে চান না, তবে সম্ভবত শেষটি হ'ল আপনি ডাটাবেসে কী ব্যবহার করতে চান।


0

পরিবর্তে toJSON, আপনি ফর্ম্যাট ফাংশন ব্যবহার করতে পারেন যা সর্বদা সঠিক তারিখ এবং সময় দেয় givesGMT

এটি সর্বাধিক শক্তিশালী ডিসপ্লে বিকল্প। এটি টোকেনগুলির একটি স্ট্রিং নেয় এবং তাদের সম্পর্কিত মানগুলির সাথে প্রতিস্থাপন করে।


0

আমি কৌনিক 8 এ এটি চেষ্টা করেছি:

  1. মডেল তৈরি করুন:

    export class Model { YourDate: string | Date; }
    
  2. আপনার উপাদান মধ্যে

    model : Model;
    model.YourDate = new Date();
    
  3. সংরক্ষণের জন্য আপনার এপিআইতে তারিখ প্রেরণ করুন

  4. এপিআই থেকে আপনার ডেটা লোড করার সময় আপনি এটি তৈরি করবেন:

    model.YourDate = new Date(model.YourDate+"Z");

আপনি আপনার সময় অঞ্চল দিয়ে আপনার তারিখটি সঠিকভাবে পাবেন।


0

এই ক্ষেত্রে আমি মনে করি আপনার তারিখটি ইউনিক্স টাইমস্ট্যাম্পে রূপান্তর করা দরকার

timestamp = testDate.getTime();
strJson = JSON.stringify(timestamp);

এর পরে আপনি একটি তারিখ অবজেক্ট তৈরি করতে এবং এটি ফর্ম্যাট করতে এটি পুনরায় ব্যবহার করতে পারেন। জাভাস্ক্রিপ্ট এবং toLocaleDateString( https://developer.mozilla.org/fr/docs/Web/JavaScript/References/Objets_globaux/ তারিখ / টো লোকালডেটস্ট্রিং সহ উদাহরণ )

newDateObject = new Date(JSON.parse(strJson));
newDateObject = newDateObject.toLocalDateStrin([
  "fr-FR",
]);

আপনি যদি এজেএক্স ব্যবহার করতে স্ট্রিংফাই ব্যবহার করেন তবে এখন এটি কার্যকর নয়। আপনার কেবল টাইমস্ট্যাম্প প্রেরণ এবং এটি আপনার স্ক্রিপ্টে পাওয়া দরকার:

$newDateObject = new \DateTime();
$newDateObject->setTimestamp(round($timestamp/1000));

সচেতন থাকুন যে getTime()সময়টি মিলিসেকেন্ডে ফিরে আসবে এবং পিএইচপি ফাংশনটি setTimestampসেকেন্ডে সময় নেয়। এজন্য আপনাকে 1000 এবং দিয়ে ভাগ করতে হবে round

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.