import 'dart:math'; import 'package:intl/intl.dart'; import 'package:muaawana/config/lang_enum.dart'; import 'package:muaawana/providers/language_provider.dart'; String formatDate(DateTime dateTime){ DateFormat outputFormat = DateFormat('EEE, dd MMM yyyy'); return outputFormat.format(dateTime); } /// Date/time locale that follows the app's current language. /// /// Only "ar_EG" is initialised (see `initializeDateFormatting` in main.dart), /// so bare "ar" must not be used here or DateFormat throws at runtime. String get appDateLocale => languageSingleton.currentLangCode == Language.ar ? 'ar_EG' : 'en_US'; /// intl's Arabic locales emit Arabic-Indic digits (\u0660\u0661\u0662...). Prices, quantities /// and IDs elsewhere in the app are shown in Western digits, so convert back to /// keep a screen internally consistent: Arabic month/day names, Western numerals. String toWesternDigits(String s) { const arabicIndic = '\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669'; var out = s; for (var i = 0; i < 10; i++) { out = out.replaceAll(arabicIndic[i], '$i'); } return out; } /// Booking timestamps need special handling. /// /// The app's write path formats the customer's *local* picked wall-clock time /// and appends a literal 'GMT' (see `service_details_provider.dart`), so the /// server stores "09:00 local" as "09:00 UTC". Reading such a value back in the /// device's local zone therefore shifts it by the UTC offset (09:00 -> 10:00 in /// UTC+1). Reading it in UTC reproduces the wall-clock time the customer /// actually picked, in any viewer timezone. The admin dashboard does the same /// thing via getTimezoneOffset(). /// /// Once the write path sends a true instant, these helpers should go back to /// plain local rendering (and existing rows will need a one-off shift). DateTime bookingInstant(int millis) => DateTime.fromMillisecondsSinceEpoch(millis, isUtc: true); /// Date half of a booking timestamp, honouring the convention above. String formatBookingDate(int millis) => toWesternDigits( DateFormat('E, dd MMM yyyy', appDateLocale).format(bookingInstant(millis))); String formatTimestampToDate(int timestamp) { DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp); String formattedDate = DateFormat('E, dd MMM yyyy').format(dateTime); return formattedDate; } class Dates{ static String convertTimetampToDateAndTime(String date){ //var dateDate = DateTime.fromMicrosecondsSinceEpoch(int.parse(date)*1000); var timestamp1 = int.parse(date); // timestamp in seconds DateTime date1 = DateTime.fromMillisecondsSinceEpoch(timestamp1); // DateTime local=date1.toUtc(); var f = DateFormat('yyyyy.MMMMM.dd GGG hh:mm aaa'); return f.format(date1); //var date = formatDate.format(dateDate); } static double roundDouble(double value, int places) { num mod = pow(10.0, places); return ((value * mod).round().toDouble() / mod); } //translate this locally static String dateDifference(String date){ var dt=DateTime.now(); var time= Dates.convertTimeStampToDatetime(date); var convDate= dt.difference(time); if(convDate.inDays>0){ return "${convDate.inDays} days ago"; } if(convDate.inHours>0){ return"${convDate.inDays} hours ago"; } if(convDate.inMinutes>0){ return "${convDate.inDays} minutes ago"; } if(convDate.inMicroseconds<0 || convDate.inMilliseconds<0 || convDate.inSeconds<0 || convDate.inMinutes<0){ if(convDate.isNegative){ }else{ return "Now"; } } return "Now"; } static int? dateOneHourDifference(String date){ var dt=DateTime.now(); var time= Dates.convertTimeStampToDatetime(date); var convDate= dt.difference(time); if(convDate.inMinutes>0 && convDate.inMinutes<=60){ return convDate.inMinutes; } return null; } static int? dateTestDifference(String date){ var dt=DateTime.now(); var time= Dates.convertTimeStampToDatetime(date); var convDate= dt.difference(time); if(convDate.inMinutes>0){ return convDate.inMinutes; } return null; } static String durationToString(int minutes) { // from 100 mins to 01:40 var d = Duration(minutes:minutes); List parts = d.toString().split(':'); return '${parts[0].padLeft(2, '0')}:${parts[1].padLeft(2, '0')}'; } //translate this locally static Duration twoDatesDateTimeDifference(String? date1, String? date2) { if(date1!=null && date2 !=null){ var dt = DateTime.fromMicrosecondsSinceEpoch(int.parse(date1)*1000); var dt2 = DateTime.fromMicrosecondsSinceEpoch(int.parse(date2)*1000); var df = dt2.difference(dt); return df; } return const Duration(); } static String convertTimeStamp(String date){ //var dateDate = DateTime.fromMicrosecondsSinceEpoch(int.parse(date)*1000); var timestamp1 = int.parse(date); // timestamp in seconds DateTime date1 = DateTime.fromMillisecondsSinceEpoch(timestamp1); var f = DateFormat('dd/MM/yyyy'); return f.format(date1); //var date = formatDate.format(dateDate); } static String convertTimeStampToWords(String date){ //var dateDate = DateTime.fromMicrosecondsSinceEpoch(int.parse(date)*1000); var timestamp1 = int.parse(date); // timestamp in seconds DateTime date1 = DateTime.fromMillisecondsSinceEpoch(timestamp1); var f = DateFormat.yMMMMd(languageSingleton.currentLangCode == Language.en ? 'en_US': 'ar_EG'); return f.format(date1); //var date = formatDate.format(dateDate); } static String convertDateTimeToWords(DateTime date){ //var dateDate = DateTime.fromMicrosecondsSinceEpoch(int.parse(date)*1000); var f = DateFormat.yMMMMd('en_US'); return f.format(date); //var date = formatDate.format(dateDate); } ///DateFormat.yMMMMEEEEd(); => Friday, June 3, 2022 09:00:00 static String convertDateTimeToFullDate(DateTime date){ var f = DateFormat.yMMMMEEEEd(); var s="${f.format(date)} ${"${date.hour>10?date.hour:("0${date.hour}")}:${date.minute>10?date.minute:("0${date.minute}")}:${date.second>10?date.second:("0${date.second}")}"}"; return s; } static String convertTimeStampToDateAndTime(String date){ //var dateDate = DateTime.fromMicrosecondsSinceEpoch(int.parse(date)*1000); var timestamp1 = int.parse(date); // timestamp in seconds DateTime date1 = DateTime.fromMillisecondsSinceEpoch(timestamp1); var f = DateFormat('yyyyy.MMMMM.dd GGG hh:mm aaa'); return f.format(date1); //var date = formatDate.format(dateDate); } static String convertDateToDateAndTime(int date){ //var dateDate = DateTime.fromMicrosecondsSinceEpoch(int.parse(date)*1000); // timestamp in seconds DateTime date1 = DateTime.fromMillisecondsSinceEpoch(date); var f = DateFormat('dd-MM-yyyy (hh:mm)'); return f.format(date1); //var date = formatDate.format(dateDate); } static String convertStringToDateAndTime(String date){ //var dateDate = DateTime.fromMicrosecondsSinceEpoch(int.parse(date)*1000); var timestamp1 = int.parse(date); // timestamp in seconds DateTime date1 = DateTime.fromMillisecondsSinceEpoch(timestamp1); var f = DateFormat('dd-MM-yyyy'); return f.format(date1); //var date = formatDate.format(dateDate); } static String convertDateTimeToDateAndTime(DateTime date){ var f = DateFormat('dd-MM-yyyy (hh:mm)'); return f.format(date); } static String convertDateTimeToDate(DateTime date){ var f = DateFormat('dd-MM-yyyy'); return f.format(date); } static String convertDateTimeToTime(DateTime date){ var f = DateFormat('h:mm a', appDateLocale); return toWesternDigits(f.format(date)); } static DateTime convertTimeStampToDatetime(String date){ //var dateDate = DateTime.fromMicrosecondsSinceEpoch(int.parse(date)*1000); var timestamp1 = int.parse(date); // timestamp in seconds DateTime date1 = DateTime.fromMillisecondsSinceEpoch(timestamp1); return date1; //var date = formatDate.format(dateDate); } static String convertTimeStampToAmPm(String date){ //var dateDate = DateTime.fromMicrosecondsSinceEpoch(int.parse(date)*1000); var timestamp1 = int.parse(date); // timestamp in seconds DateTime date1 = DateTime.fromMillisecondsSinceEpoch(timestamp1); var f = DateFormat('h:mm a'); return f.format(date1); //var date = formatDate.format(dateDate); } static bool checkExpiration(String startDate, String endDate){ var startPeriodDatee= Dates.convertToLocalDatetime(startDate); var enPeriodDatee= Dates.convertToLocalDatetime(endDate); var now=DateTime.now(); if(now.isAfter(startPeriodDatee) && now.isBefore(enPeriodDatee)){ return true; } return false; } static DateTime getFirstDateOfCurrentYear(){ DateTime date = DateTime.now(); var firstDayOfMonth = DateTime(date.year, 1, 1); return firstDayOfMonth; } static DateTime getLastDateOfCurrentYear(){ DateTime date = DateTime.now(); var lastDayOfMonth = DateTime(date.year, 12, 31); return lastDayOfMonth; } static DateTime convertToLocalDatetime(String date){ DateTime dateToConvert = DateTime.fromMillisecondsSinceEpoch(int.parse(date)); var d=dateToConvert.toUtc().add(const Duration(hours: 1)); return d; } static List getDaysInBetween(DateTime startDate, DateTime endDate) { List days = []; for (int i = 0; i <= endDate.difference(startDate).inDays; i++) { days.add(startDate.add(Duration(days: i))); } return days; } static int getDaysDifference(String date){ var timestamp1 = int.parse(date); // timestamp in seconds DateTime date1 = DateTime.fromMillisecondsSinceEpoch(timestamp1); DateTime local=date1.toUtc(); var df=local.difference(DateTime.now()); return df.inDays; } static DateTime convertToLocalDate(String date){ DateTime dateToConvert = DateTime.fromMillisecondsSinceEpoch(int.parse(date)); var d=dateToConvert.toUtc().add(const Duration(hours: 1)); var y=d.year; var m=d.month; var day=d.day; return DateTime(y,m,day); } static String truncateDatetime(DateTime d){ var f = DateFormat('dd/MM/yyyy'); return f.format(d); } static DateTime addPMHour(String startHour,DateTime finalDate){ switch (startHour){ case "01": finalDate=finalDate.add(const Duration(days:0,hours:13)); break; case "02": finalDate=finalDate.add(const Duration(days:0,hours:14)); break; case "03": finalDate=finalDate.add(const Duration(days:0,hours:15)); break; case "04": finalDate=finalDate.add(const Duration(days:0,hours:16)); break; case "05": finalDate=finalDate.add(const Duration(days:0,hours:17)); break; case "06": finalDate=finalDate.add(const Duration(days:0,hours:18)); break; case "07": finalDate=finalDate.add(const Duration(days:0,hours:19)); break; case "08": finalDate=finalDate.add(const Duration(days:0,hours:20)); break; case "09": finalDate=finalDate.add(const Duration(days:0,hours:21)); break; case "10": finalDate=finalDate.add(const Duration(days:0,hours:22)); break; case "11": finalDate=finalDate.add(const Duration(days:0,hours:23)); break; case "12": finalDate=finalDate.add(const Duration(days:0,hours:00)); break; default: return finalDate; } return finalDate; } static int? convertToPM(int startHour){ int date=startHour; switch (startHour){ case 1: date=13; break; case 2: date=14; break; case 3: date=15; break; case 4: date=16; break; case 5: date=17; break; case 6: date=18; break; case 7: date=19; break; case 8: date=20; break; case 9: date=21; break; case 10: date=22; break; case 11: date=23; break; case 12: date=00; break; default: return date; } return date; } }