DateTime in UTC not converting to Local

[亡魂溺海] 提交于 2020-12-30 06:38:05

问题


I'm receiving a DateTime response from API that's sets the timezone to UTC.

But when I try to convert the received data using toLocal() it doesn't convert.

my local time is HKT

here's my code.

    //TIME DIFFERENCE
  getNotificationDate(DateTime date) {
    date = date.toUtc();
    final convertedDate = date.toLocal();

    final dateNow = DateTime.now();
    print('TIMENOW: ' + dateNow.toString());
    print('TIMENOTIFC: ' + convertedDate.toString());
    final difference = dateNow.difference(convertedDate);
    print('DIFFERENCE: ' + difference.toString());
    return getDurationFormat(difference);
  }

EDIT:

date is the DateTime I'm receiving from the API. which is in UTC timezone.

I used print('TIMEZONENAME: ' + date.timeZoneName; and it automatically sets the timezone to HKT. that's why it does nothing when I try to use date.toLocal()


回答1:


Flutter gave us the easiest way to convert it. You just need to pass utc: true while parsing your date.

var dateTime = DateFormat("yyyy-MM-dd HH:mm:ss").parse(dateUtc, true);
var dateLocal = dateTime.toLocal();

Input:

Assume my TimeZone : +05:30

UTC Date -> 2020-02-12 23:57:02.000

Output:

Local Date -> 2020-02-12 18:27:02.019660




回答2:


// you have time in utc
var dateUtc = DateTime.now().toUtc();
print("dateUtc: $dateUtc"); // 2019-10-10 12:05:01

// convert it to local
var dateLocal = dateUtc.toLocal();
print("local: $dateLocal"); // 2019-10-10 14:05:01

Can you see the difference in hours, in utc it is 12 and locally it is 14.




回答3:


You can try this code:

getNotificationDate(DateTime date) {
    date = DateTime.utc(date.year,date.month,date.day,date.hour,date.minute,date.second);;
    final convertedDate = date.toLocal();

    final dateNow = DateTime.now();
    print('TIMENOW: ' + dateNow.toString());
    print('TIMENOTIFC: ' + convertedDate.toString());
    final difference = dateNow.difference(convertedDate);
    print('DIFFERENCE: ' + difference.toString());
    return getDurationFormat(difference);
  }



回答4:


Install intl package from pub.dev

add following line :

import 'package:intl/intl.dart';

You can make an extension like below so it will be very helpful and easy to use anywhere in a whole project.

//just make sure you have passed the right date format of utc("yyyy-MM-dd HH:mm:ss"). I have passed by default my format.

//for example
// 2020-11-25 24:12:36 -> "yyyy-MM-dd HH:mm:ss"
DateTime localDate=utcDateTime.toLocalDateTime();


//for different formats you can pass your own dateFormat for utcDate like below:
// 20-11-25 24:12:36 -> "yy-MM-dd HH:mm:ss"
DateTime localDate=utcDateTime.toLocalDateTime("yy-MM-dd HH:mm:ss");

extension DateTimeExtension on DateTime {
  DateTime toLocalDateTime({String format = "yyyy-MM-dd HH:mm:ss"}) {
    var dateTime = DateFormat(format).parse(this.toString(), true);
    return dateTime.toLocal();
  }
}



回答5:


For those who parsing TimeStamp from Firestore.

*sentAt is Timestamp

String timeToDate = widget.sentAt.toDate().toString();
    var dateTime = DateFormat("yyyy-MM-dd HH:mm:ss").parse(timeToDate, true);
    var dateLocal = dateTime.toLocal();


来源:https://stackoverflow.com/questions/58322185/datetime-in-utc-not-converting-to-local

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!