Thứ Tư, 27 tháng 2, 2013

Javascript: Convert Datetime

- Convert Date time by Timezone: (Example convert date time to New Zealand time zone)

/// <summary>
/// Convert local date time to New Zealand timezon
/// </summary>
/// <param name="dateTime" type="DateTime">local datetime</param>
ConvertByNZTimeZone: function (dateTime) {
 //daylight saving
 var dateStartCurrentYear = new Date(dateTime.getFullYear(), 8, 30, 2, 0, 0, 0),
  dateEndNextYear = new Date(dateTime.getFullYear() + 1, 3, 7, 3, 0, 0, 0),
        dateStartPrevYear = new Date(dateTime.getFullYear() - 1, 8, 30, 2, 0, 0, 0),
  dateEndCurrentYear = new Date(dateTime.getFullYear(), 3, 7, 3, 0, 0, 0),
  offset = 12; //offset timezone
            
    //detect base on:
 //   - start date from previous year and end date of current year
 //   - start date from current year and end date of next year
 if ((dateStartPrevYear <= dateTime && dateTime <= dateEndCurrentYear) ||
        (dateStartCurrentYear <= dateTime && dateTime <= dateEndNextYear)) {
  offset = 13;
 }
 
 // convert to msec
 // add local time zone offset 
 // get UTC time in msec
 utc = dateTime.getTime() + (dateTime.getTimezoneOffset() * 60000);
 
 // create new Date object for different city
 // using supplied offset
 nd = new Date(utc + (3600000 * offset));
 
 // return time as a string
 return nd;
}


- Convert UTC date string to local date time:
// <summary>
// Convert json utc date string to local date.
// </summary>
// <param name=utcString>Utc string</param>
function ConvertUTCDate(uctString) {
 if (!uctString) {
  return null;
 }
 
 if ($.browser.mozilla && uctString.indexOf("Z") === -1) {
  uctString += "Z";
 }
 
 var date = new Date(uctString);
 
 return date; 
}


Thứ Năm, 31 tháng 1, 2013

Thứ Ba, 29 tháng 1, 2013

Javascript: Reverse number (Use to reverse for Units of Measurement)

I have a task to manage Units of Measurement. Normally, I think it is simple to process relationship between Units of Measurement. In fact, I have some bugs with browsers when processing reverse value for relations as 1/0.00001 ==> 99999.99999999999.

After some days to research, I can't solve this problem. Then my partner suggests way to solve this problem as follow:

         (1 * 10 * precision) / (reversedValue * 10 * precision)
Note: this way only applied for reversed value with precision > 0. For zero precision, we use normal way as 1 / reversedValue.

When working this task, I have another problem as 1 / 10000000 ==> 1e-7. We can't display this result to UI. So my partner and I found way to solve this problem as follow:

        - Get exponent value and precision of number before 'e' to use as precision of result.
        - Then use 'toFixed' function to convert result to number without exponent. If we use 'toFixed' function, we only have maximium precision 20.
         Example: value = 1e-7; 
                          value = value.toFixed(GetPrecision(value)); 

The following are functions to get reverse value and get precision (edit a function from researching on internet): 


/// <summary> 
/// Get reverse value 
/// </summary>
GetReverseValue: function (reversedValue) {
    var precision = 0;
 
    if (reversedValue === 0) {
        return;
    }
 
    reversedValue = value.toString().replace(/,/g, "");
    reversedValue = parseFloat(reversedValue);
    precision = self.GetPrecision(reversedValue);
 
    if (precision > 0) {
        reversedValue = (1 * 10 * precision) / (reversedValue * 10 * precision);
    } else {
        reversedValue = 1 / reversedValue;
        reversedValue = reversedValue.toFixed(self.GetPrecision(reversedValue));
    }
 
    return value;
},
 
/// <summary>
/// Get precision of a number
/// </summary>
GetPrecision: function (scinum) {
    if (typeof (scinum) !== "string") {
        scinum = scinum.toString();
    }
 
    var arr = [],
        precision = 0;
 
    //get precision from exponent
    arr = scinum.split('e');
    if (arr[1]) {
        precision = Math.abs(arr[1]);
    }
 
    //get precision from fraction
    arr = arr[0].split('.');
    if (arr[1]) {
        precision += arr[1].length;
    }
 
    //if precision > 20, set it to max precision
    if (precision > 20) {
        precision = 20;
    }
 
    return precision;
}