2016-10-17 1 views
1

Я написал эту функцию в AS3, которая преобразует миллисекунды в формат считываемого времени: 00:00:00 (hh/mm/ss).Предупреждение о дублировании Flash/AS3 в условном

function convertTime(millis:Number):String { 

    var Seconds = ((millis/1000) % 60); 
    var Minutes = (((millis/1000)/60) % 60); 
    var Hours = ((((millis/1000)/60)/60) % 24); 

     if (Math.floor(Seconds) < 10) { 
      var newSeconds = "0" + Math.floor(Seconds); 
     } else { 
      var newSeconds = Math.floor(Seconds); 
     } 

     if (Math.floor(Minutes) < 10) { 
      var newMinutes = "0" + Math.floor(Minutes); 
     } else { 
      var newMinutes = Math.floor(Minutes); 
     } 

     if (Math.floor(Hours) < 10) { 
      var newHours = "0" + Math.floor(Hours); 
     } else { 
      var newHours = Math.floor(Hours); 
     } 

    return (newHours + ":" + newMinutes + ":" + newSeconds); 
} 

Все, кажется, работает, за исключением секунд, которые только когда-либо возвращает одну цифру, которая, я уверен, имеет отношение к следующему:

Вспышки компилятор вырвет «Предупреждение 3596: Повторяющееся определение переменного "для каждого экземпляра переменных, заданных в операторах else?

Я делаю это неправильно?

Несомненно, факт, что они содержатся в условных операторах, должен означать, что каждая переменная задается только один раз справа?

Или я должен быть в явном виде в AS3, отбрасывая else (s)? например:

if (Math.floor(Hours) < 10) { 
      var newHours = "0" + Math.floor(Hours); 
     } 

if (Math.floor(Hours) >= 10) { 
      var newHours = Math.floor(Hours); 
     } 

ответ

4

Ahh Я нашел его. AS3 действительно строг с объявлениями var.

Значение переменной уже установлен в случае поэтому нет необходимости повторно объявить его в другом:

if (Math.floor(Hours) < 10) { 
      var newHours = "0" + Math.floor(Hours); 
     } else { 
      newHours = Math.floor(Hours); 
     } 
+0

var newHours: Строка должна быть указана перед блоком if/else, введенным как строка, если вы добавите «0». Пример: newHours = "0" + Math.floor (Hours) .toString(); – tatactic

+0

Не могли бы вы пометить этот вопрос, как решили? Это раздражает, чтобы каждый раз проверять этот вопрос. Поскольку проблема отмечена как решившаяся, я знаю, что мне не нужно было ее повторять снова и снова. Вы тоже можете принять свой собственный ответ! Но, пожалуйста, потеряйте эту тему! С уважением. – tatactic

1

[EDIT]

Чтобы избежать всех тех, кто если и еще (с помощью Get Timer предположим), вы можете использовать вместо этого класс даты и использовать класс flash.globalization.DateTimeFormatter.

Для форматирования вывода просто используйте метод setDateTimePattern(). В вашем случае используйте setDateTimePattern ("hh: mm: ss"); за исключением случаев, когда вы хотите получить миллисекунды ...

Класс DateTimeFormatter действительно полезен. Но возникает проблема, когда вы пытаетесь получить миллисекунды («hh: mm: ss: SSS»), поэтому я попытался улучшить код, чтобы получить миллисекунды, если вам это нужно.

[РЕДАКТИРОВАТЬ 2]

import flash.utils.getTimer; 
import flash.globalization.DateTimeFormatter; 
import flash.globalization.DateTimeStyle; 

var currentTime = new Date(); 
function getMS():String{ 
    var ms = currentTime.milliseconds; 
    if (ms<10) 
    { 
     ms = "000" + ms; 
    } 
    if (ms<100) 
    { 
     ms = "00" + ms; 
    } 
    return ms.toString(); 
} 

function formatDate(date:Date) { 
    var dtf:DateTimeFormatter = new DateTimeFormatter("en,EN"); 
    dtf.setDateTimePattern("yyyy-MM-dd HH:mm:ss:"); 
    var longDate:String = dtf.format(date); 
    trace(longDate.toString() + getMS()); 
    //trace("***LocaleID requested=" + dtf.requestedLocaleIDName); 
    //trace("***Format requested (" + dtf.getDateTimePattern() + ")"); 
} 
trace("setDateTimePattern example"); 
formatDate(currentTime); 
// output the current time formated as "hh:mm:ss:SSS" 

Таким образом, в этом случае выход:

setDateTimePattern example 
2016-10-23 11:53:32:979 

[/ EDIT 2]

[/ EDIT]

наилучшими пожеланиями. Николас.

+0

Для тиража: -1. Они ничего не добавляют к ответу, кроме шума. Без них это может быть хорошим ответом. – null

+0

@null Я пытаюсь улучшить ответ и надеюсь, что он звучит менее шумно. Извините, моя ошибка! Я не владею английским языком и хотел быстро поехать ... – tatactic

+1

@Grant вы видели мой ответ? Это позволяет избежать множества циклов, и вы можете использовать этот метод для форматирования объектов даты по своему усмотрению. Проблема в том, что у вас могут возникнуть проблемы, если вы хотите отобразить миллисекунды. «MMMM», но есть способ обходного решения. Надеюсь, это поможет. – tatactic

0

Как вы нашли, это связано с тем, как AS3 обрабатывает объявления переменных. Это связано с моделью области AS3 с использованием области функционального уровня, но не с областью уровня блока. В декларации переменных в коде получить водрузили к верхней части функции, что эквивалентно:

function convertTime(millis:Number):String { 
    var Seconds = ((millis/1000) % 60); 
    var Minutes = (((millis/1000)/60) % 60); 
    var Hours = ((((millis/1000)/60)/60) % 24); 
    var newSeconds; //Seconds 'if' case 
    var newSeconds; //Seconds 'else' case 
    var newMinutes; //Minutes 'if' case 
    var newMinutes; //Minutes 'else' case 
    var newHours; //Hours 'if' case 
    var newHours; //Hours 'else' case 

    if (Math.floor(Seconds) < 10) { 
     newSeconds = "0" + Math.floor(Seconds); 
    } else { 
     newSeconds = Math.floor(Seconds); 
    } 

    if (Math.floor(Minutes) < 10) { 
     newMinutes = "0" + Math.floor(Minutes); 
    } else { 
     newMinutes = Math.floor(Minutes); 
    } 

    if (Math.floor(Hours) < 10) { 
     newHours = "0" + Math.floor(Hours); 
    } else { 
     newHours = Math.floor(Hours); 
    } 

    return (newHours + ":" + newMinutes + ":" + newSeconds); 
} 

Так, конечно, вы видите предупреждение 3596 для тех.

См. Также http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f9d.html для получения более подробной информации.

 Смежные вопросы

  • Нет связанных вопросов^_^